在acm题中从来没用过long double,这题本来快做对了,可惜用的是double,精度被卡死。
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<sstream>
#include<utility>
#include<iterator>
using namespace std;
const int INF=1e9+7;
const double eps=1e-7;
typedef __int64 LL;
const int maxn=100000;
const double PI=4.0*atan(1.0);
int n;
struct Point
{
int x,y;
long double rad;
int ind;
bool operator<(const Point c)const
{
return rad<c.rad;
}
}a[maxn+5];
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].ind=i;
a[i].rad=atan2(a[i].y,a[i].x);
}
sort(a+1,a+1+n);
long double delta=a[n].rad-a[1].rad;
if(delta>PI) delta=2*PI-delta;
long double ans=delta;
int ansL=a[1].ind,ansR=a[n].ind;
for(int i=2;i<=n;i++)
{
int first=a[i-1].ind;
int second=a[i].ind;
long double delta=a[i].rad-a[i-1].rad;
if(delta>PI) delta=2*PI-delta;
if(delta<ans)
{
ans=delta;
ansL=first;
ansR=second;
}
}
printf("%d %d\n",ansL,ansR);
}
return 0;
}