给定平面上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 <bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+100;
ll arr[N];
ll app[N];
int vis[N];
int main()
{
ios::sync_with_stdio(false);
ll n;
cin>>n;
ll p,y=0,q;
memset(vis,0,sizeof vis);
for(int i=0;i<n;i++)
{
cin>>arr[i]>>app[i];
if(app[i]>=y)
{
y=app[i];
p=i;
}
}
vis[p]=1;
ll a,b,c;
if(p!=n-1)
{
a= app[p+1] - app[p];
b = arr[p+1] - arr[p];
c = -a*arr[p] + b*app[p];
q=p+1;
}
else
{
a= app[p-1] - app[p];
b = arr[p-1] - arr[p];
c = -a*arr[p] + b*app[p];
q=p-1;
}
vis[q]=1;
for(int i=0;i<n;i++)
{
if(!vis[i]&&a*arr[i] -b*app[i] + c <= 0)
{
a= app[i] - app[p];
b = arr[i] - arr[p];
c = -a*arr[p] + b*app[p];
q=i;
}
}
cout<<++p<<' '<<++q<<endl;
return 0;
}