超级莫名其妙的一题,题目上面说点都坐标都是整数,叉积也只是坐标运算一下。可就是WA。我还以为是逆时针,顺时针什么鬼的出问题了。
改成double就好了。
找出两个点,这两个点的连线把点集平分为两块。
级角排序一下就好了,第一点和中间一点的连线就ok了。
顺时针,逆时针无所谓都一样~
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct point{double x,y;int id;};
point p[10000+5];
const double eps = 1e-6;
double cross(point a,point b)
{
return ( (a.x-p[0].x )*( b.y-p[0].y ) - (a.y-p[0].y )*(b.x-p[0].x ) );
}
bool angcmp( point a,point b)
{
return cross(a,b)>eps;
}
int main()
{
int n;
cin>>n;
int t = 0;
for( int i = 0 ;i<n; ++i)
{
scanf("%lf %lf",&p[i].x,&p[i].y);
p[i].id = i+1;
if( p[i].x<p[t].x ||
( p[i].x==p[t].x && p[i].y < p[t].y))
t = i;
}
swap(p[0],p[t]);
sort(p+1,p+n,angcmp);
printf("%d %d\n",p[0].id,p[n/2].id);
return 0;
}