E题:Opposites Attract

题目链接:https://nanti.jisuanke.com/t/44821

题目大意:

题目明确了圆盘上各块的得分,给出m(t)个点,问这些点在圆盘上的分数总和。

思路:

一个2π的圆,可以想到用弧度来确定点的位置(一开始做的时候用的角度,却WA了),弧度就是atan(x,y)  如果再除以 π,就可以简化,注意单独讨论点在y轴的情况。

解题代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <string>
 6 #include <cstring>
 7 #include <map>
 8 using namespace std;
 9 typedef long long ll;
10 const double PI=3.1415926;
11 map <char,int> ma;
12 int main()
13 {
14    ll t;
15    cin >> t;
16    while(t--)
17    {
18        ll n,m,sum = 0;
19        double r1,r2,r3;
20        cin >> n >> r1 >> r2 >> r3 >> m;
21        for(int i = 0;i < m;i++)
22        {
23            double x,y,l,o;
24            cin >> x >> y;
25            l = hypot(x,y);
26            if(l > r3)
27               continue;
28            else if(l < r1)
29               sum += 50;
30            else
31            {
32                if(x == 0)
33                {
34                    if(y > 0)
35                      o = 0.5;
36                    else
37                      o = 1.5;
38                }
39                else
40                {
41                    o = atan(y/x) / PI;
42                    if(x > 0 && y < 0)
43                        o = 2.0 + o;
44                    else if(x < 0 && y < 0)
45                        o = 1.0 + o;
46                    else if(x < 0 && y > 0)
47                        o = 1.0 + o;
48                    double num = 1, one = 2.0/n;
49                    while(o - one > 0)
50                    {
51                        num ++;
52                        one += 2.0/n;
53                    }
54                    if(l < r2)
55                       sum += num*2;
56                    else
57                       sum += num;
58                }
59            }
60 
61        }
62        cout << sum << endl;
63 
64    }
65 }