码迷,mamicode.com
首页 > 其他好文 > 详细

hihoCoder1687(向量叉积)

时间:2018-02-13 23:41:55      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:opened   向量   http   string   media   nbsp   problem   print   str   

#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;
}
View Code

 




hihoCoder1687(向量叉积)

标签:opened   向量   http   string   media   nbsp   problem   print   str   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!