题目链接: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 }