HCW 19 Team Round (ICPC format) H Houston, Are You There?(极角排序)

题目链接:http://codeforces.com/gym/102279/problem/H

大致题意: 你在一个定点,你有个长度为R的钩子,有n个东西在其他点处,问你能勾到的东西的数量是多少?

思路:明明一道几何题,罗老板居然用gcd巧妙的A了,真是太强了。如果一件物品挡住了另一件物品,那么它是勾不到的。

   首先将所有距离在R的点都拎出来,然后对于给定点进行极角排序,最后俩俩相邻比较即可确定答案。

AC代码:

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 const double eps = 1e-12;
 7 const int maxn = 5e5+50;
 8 int sgn(double x){
 9     if(fabs(x) < 0) return 0;
10     else return x < 0 ? -1 : 1;
11 }
12 struct Point{
13     double x, y;
14     Point(){}
15     Point(double _x, double _y){
16         x = _x, y = _y;
17     }
18     void input(){
19         scanf("%lf%lf", &x, &y);
20     }
21     void output(){
22         printf("%.2f %.2f",x ,y);
23     }
24     bool operator == (Point b) const{
25         return sgn(x - b.x) == 0 && sgn(y - b.y) == 0;
26     }
27     bool operator < (Point b)const{
28         return sgn(x - b.x) == 0 ? sgn(y - b.y < 0) : x < b.x;
29     }
30     Point operator - (const Point &b)const{
31         return Point(x - b.x, y - b.y);
32     }
33     //叉积
34     double operator ^(const Point &b){
35         return x * b.y - y * b.x;
36     }
37     //点积
38     double operator *(const Point &b){
39         return x * b.x + y * b.y;
40     }
41     double distant(Point p){
42         return hypot(x - p.x, y - p.y);
43     }
44 
45 };
46 Point p[maxn];
47 struct cmp{
48         Point p;
49         cmp(const Point &p0) {p = p0;}
50         bool operator()(const Point &aa, const Point &bb){
51             Point a = aa, b = bb;
52             int d = sgn((a - p) ^ (b - p));
53             if(d == 0){
54                 return sgn(a.distant(p) - b.distant(p)) < 0;
55             }
56             return d > 0;
57         }
58 };
59 
60 
61 int main()
62 {
63     int n;
64     double x0, y0, r;
65     double x, y;
66     scanf("%lf %lf %lf %d",&x0, &y0, &r, &n);
67     int m = 0;
68     Point s = Point(x0, y0), e;
69     while(n--){
70         e.input();
71         //printf("d = %.12f\n",e.distant(s) - r);
72         if(e.distant(s) - r <= 0)
73         p[m++] = e;
74     }
75     int ans = 0;
76     sort(p, p + m, cmp(s));
77     for(int i = 0;i < m;i++)
78     {
79         if(i == 0 ) ans++;
80         else if(((p[i] - s) ^ (p[i-1] - s)) != 0.0)
81             ans++;
82     }
83     printf("%d\n",ans);
84     return 0;
85 }

附罗老板的神奇gcd:(明显代码长度短很多啊orz)

猜你喜欢

转载自www.cnblogs.com/Carered/p/11415989.html
今日推荐