Educational Codeforces Round 1(C. Nearest vectors)

  题目链接:http://codeforces.com/problemset/problem/598/C

  题意是给你一个数n,下面n行,每行给你横坐标x和纵坐标y(x != 0 && y != 0)。求当两个点与原点形成的角度最小时,是哪两个点。

  先介绍atan2这个函数,atan2(double y,double x) 其中y代表已知点的Y坐标 同理x ,返回值是此点与远点连线与x轴正方向的夹角,这样它就可以处理四个象限的任意情况了,它的值域相应的也就是-180~180了。

  我觉得最好还是用atan2这个函数,求出与x正轴的角度,然后从小到大排序,处理相邻的两个点的角度(后面的减前面的),最后处理第一个和最后一个点角度,最好乘上个1000,精度问题...

  代码如下:

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 const int MAXN = 1e5 + 10;
 8 double PI = acos(-1) , M = 10000;
 9 struct data {
10     double x , y , ang;
11     int id;
12 }a[MAXN];
13 
14 bool cmp(data a , data b) {
15     return a.ang < b.ang;
16 }
17 //min()函数只能用于整数
18 double MIN(double x , double y) {  
19     if(x > y) 
20         return y;
21     return x;
22 }
23 
24 int main() 
25 {
26     int n;
27     ios::sync_with_stdio(false);
28     while(cin >> n) {
29         for(int i = 0 ; i < n ; i++) {
30             cin >> a[i].x >> a[i].y;
31             a[i].id = i + 1;
32             a[i].ang = atan2(a[i].y , a[i].x) * 180.0 * M / PI;
33         }   
34         sort(a , a + n , cmp);
35         int id1 , id2;  
36         double Min = 100000000.0 , temp;
37         for(int i = 1 ; i < n ; i++) {
38             temp = a[i].ang - a[i - 1].ang;
39             temp = MIN(temp , 360 * M - temp);
40             if(Min > temp) {
41                 id1 = a[i - 1].id;
42                 id2 = a[i].id;
43                 Min = temp;
44             }
45         }
46         temp = a[n - 1].ang - a[0].ang;
47         temp = MIN(temp , 360 * M - temp);
48         if(temp < Min) {
49             cout << a[0].id << " " << a[n - 1].id << endl;
50         } 
51         else {
52             cout << id1 << " " << id2 << endl;
53         }
54     }
55 }

 

你可能感兴趣的:(Educational Codeforces Round 1(C. Nearest vectors))