给定平面上N个点P1=(X1, Y1), P2=(X2, Y2), ... PN=(XN, YN)。
请你从中找到两个不同的点Pi和Pj满足:其他所有点都在Pi和Pj连线的同一侧(可以在连线上)。
如果有多组答案满足条件,你可以输出任意一组。
Input第一行包含一个整数N。
以下N行每行包含两个整数Xi和Yi。
对于50%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000 0 ≤ Xi, Yi ≤ 1000000
Output输出由一个空格隔开的两个整数i和j,注意1 ≤ i, j ≤ N且i ≠ j。
6 0 10 7 0 8 8 10 18 15 13 20 4Sample Output
5 6
思路:先按照横坐标由大到小进行排序,找到最右下角的点,找到一个经过该点斜率最大的,即为答案。
代码参考:
#include <iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#define max(a,b) a>b?a:b
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
struct node{
double x,y;
int z;
};
node s[220010];
bool cmp(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x>b.x;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&s[i].x,&s[i].y);
s[i].z=i+1;
}
sort(s,s+n,cmp);
double x1=s[1].x-s[0].x,y1=s[1].y-s[0].y;
int ans=1;
for(int i=2;i<n;i++)
{
double x2=s[i].x-s[0].x;
double y2=s[i].y-s[0].y;
if(x1*y2-x2*y1>0)
{
x1=x2;
y1=y2;
ans=i;
}
}
printf("%d %d\n",s[ans].z,s[0].z);
}
return 0;
}