hihoCoder1687(向量叉积)

#1687 : 寻找切线

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

给定平面上N个点P1=(X1, Y1), P2=(X2, Y2), ... PN=(XN, YN)。

请你从中找到两个不同的点Pi和Pj满足:其他所有点都在Pi和Pj连线的同一侧(可以在连线上)。

如果有多组答案满足条件,你可以输出任意一组。

输入

第一行包含一个整数N。

以下N行每行包含两个整数Xi和Yi

对于50%的数据,1 ≤ N ≤ 1000

对于100%的数据,1 ≤ N ≤ 100000 0 ≤ Xi, Yi ≤ 1000000

输出

输出由一个空格隔开的两个整数i和j,注意1 ≤ i, j ≤ N且i ≠ j。

样例输入
6
0 10
7 0
8 8
10 18
15 13
20 4
样例输出
5 6

分析:先按一定顺序排序,再用向量叉积更新某一侧的点。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct Node{
    double x,y;
    int num;
}a[220000];
int cmp(Node A,Node B)
{
    if(A.x>B.x) return 1;
    else if(A.x==B.x&&A.y<B.y) return 1;
    return 0;
}
int main()
{
    int N;
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%lf%lf",&a[i].x,&a[i].y);
        a[i].num=i+1;
    }
    //找横坐标最大的点(右下角)
    sort(a,a+N,cmp);
    int index=1;
    double y1=a[1].y-a[0].y,x1=a[1].x-a[0].x;//(X,Y)
    for(int i=2;i<N;i++)
    {
        double y2=a[i].y-a[0].y;
        double x2=a[i].x-a[0].x;
        if(x1*y2-x2*y1>0)
        {
            index=i;
            x1=x2;y1=y2;
        }
    }
    printf("%d %d\n",a[0].num,a[index].num);
    return 0;
}


原文地址:https://www.cnblogs.com/ACRykl/p/8447613.html

时间: 2024-08-27 14:43:38

hihoCoder1687(向量叉积)的相关文章

学习总结-几何.向量叉积

学习总结-几何.向量叉积 假设有向量P(x1,y1)和Q(x2,y2) 那么向量P和Q的叉积表示为P×Q 并且P×Q=x1?y2?x2?y1 叉积的性质: 一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系: 若 P×Q>0, 则P在Q的顺时针方向; 若 P×Q<0, 则P在Q的逆时针方向; 若 P×Q=0, 则P与Q共线,但可能同向也可能反向. ·顺时针 ·逆时针 应用,给出一个序列的点,判断它是顺时针还是逆时针:计算连续两个点的叉积,包括第一个和最后一个,求他们的和,大于0

向量叉积定义的证明

前面写了一篇向量点积定义的证明,由于这个证明比较简单,所以也没有引起深入的思考.后来打算写一篇叉积的证明时,却发现有些东西真的不好理解. 设两个向量$\mathbf{a} = (x_1, y_1, z_1), \mathbf{b} = (x_2, y_2, z_2)$,两向量夹角为$\theta$,很多教材包括维基百科(Cross Product)等给出的定义都是: $$\mathbf{c} = \mathbf{a} \times \mathbf{b} = \mathbf{n} |\mathbf

向量叉积判断两线段是否相交

判断两直线p1p2与q1q2是否相交,用向量叉积来判断 如果P x Q >0,则P在Q的顺时针方向: 如果P x Q <0,则P在Q的逆时针方向: 如果P x Q=0,则P与Q共线,可能同向也可能反向 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> typedef struct node {

向量叉积

叉积 叉积的计算是线段方法的核心,考虑下图所示的向量P1和P2.我们可以把叉积理解为由原点(0,0),P1,P2和P1+P2所构成的平行四边形的有向面积.另一种与之等价但是更有效的定义方式是将叉积看做行列式矩阵: P1=(x1,y1) P2=(x2,y2) 若P1与P2的叉积为正,说明相对于原点,P1位于P2的顺时针方向,反之P1位于P2的逆时针方向,若为0,表明两个向量共线,方向可能相同,也可能相反. 上代码: 1 #ifndef GEO_GEOMETRY_H_ 2 #define GEO_G

HDU 5033 Building(类凸包+向量叉积的应用)

Building Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1138    Accepted Submission(s): 321 Special Judge Problem Description Once upon a time Matt went to a small town. The town was so sma

向量点积、叉积的意义

1.向量点积意义 ①二维向量A和B点积(结果为标量)定义为:A.dot(B) = |A|*|B|*cos(a) 比较重要的用途(数学意义)为: ②得到向量夹角.(根据cos(a)计算得到) ③得到对应单位分量上的长度.(当向量B为单位向量时,则|A|*cos(a)表示向量A在向量B上的单位分量) 可用于凸多边形的碰撞检测(分离轴定理) 2.向量叉积意义 ①二维向量A和B叉积(结果为标量)定义为:A.cross(B) = |A|*|B|*sin(a) 比较重要的用途(数学意义)为: ②得到向量夹角

向量的点积与叉积回顾

向量是3D图形处理.图像处理的基础:在这里,我们回顾一下基本的支持: 向量的数量积和向量积: (1)  向量的数1量积   (1)  向量的向量积 两个向量a和b的叉积(向量积)可以被定义为: 在这里θ表示两向量之间的角夹角(0° ≤ θ ≤ 180°),它位于这两个矢量 所定义的平面上. 向量积的模(长度)可以解释成以a和b为邻边的平行四边形的面积.求三角形ABC的面积,根据向量积的意义,得到: a=axi+ayj+azk; b=bxi+byj+bzk; a×b=(aybz-azby)i+(a

c#封装三维向量,另外也看了下别人的C++封装

一. c#实现 /* Vector3 Definition Created by taotao man on 2016-4-12 brief:封装三位向量类Vector3 // 修改记录: date: add SetA() Change GetA(); */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; name

利用向量积(叉积)计算三角形的面积和多边形的面积

利用向量积(叉积)计算三角形的面积和多边形的面积: 向量的数量积和向量积: (1)  向量的数量积   (1)  向量的向量积 两个向量a和b的叉积(向量积)可以被定义为: 在这里θ表示两向量之间的角夹角(0° ≤ θ ≤ 180°),它位于这两个矢量 所定义的平面上. 向量积的模(长度)可以解释成以a和b为邻边的平行四边形的面积.求三角形ABC的面积,根据向量积的意义,得到: a=axi+ayj+azk; b=bxi+byj+bzk; a×b=(aybz-azby)i+(azbx-axbz)j