http://codeforces.com/problemset/problem/598/C
题目大意: 给你你个向量 向量的起点都是从(0,0)开始的 求哪个角最小 输出这两个向量
这是第一次接触极角
一个函数图像上某一点到原点的距离就是极径,极径与x轴的夹角就是极角
按照极角排序 是从第三象限的最右边的开始是最小 一直逆时针转到第二象限的最右边
求极角差最小就行了
但是卡精度问题 把double换成long double 就好了 (我也不知道为什么)
#include<stdio.h> #include<math.h> #include<algorithm> #include<iostream> #define INF 0x3f3f3f3f3 using namespace std; struct node{int x,y,j; long double k;}a[101000]; int cmp(node c,node d) { return c.k<d.k; } int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d %d",&a[i].x,&a[i].y); a[i].k=atan2(a[i].y,a[i].x); a[i].j=i; } sort(a+1,a+1+n,cmp); a[0].k=a[n].k; a[0].j=a[n].j; int xx=0,yy=0; long double Min=INF; for(int i=1;i<=n;i++) { long double jiao=a[i].k-a[i-1].k; if(jiao<0) jiao+=acos(-1.0)*2; if(jiao<Min) { Min=jiao; xx=a[i].j; yy=a[i-1].j; } } printf("%d %d\n",xx,yy); } return 0; }
时间: 2024-10-12 07:55:42