C. Nearest vectors--cf598C(极角排序)

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
",xx,yy);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/linliu/p/5450697.html