腾讯手机地图
腾讯手机地图的定位功能用到了用户手机的多种信号,这其中有的信号的作用范围近,有的信号作用的范围则远一些。有的信号相对于用户在不同的方位强度是不同的,有的则是在任何一个方向上信号强度都一致的。
已知用户面向北方拿着自己的手机,在不同方位的各种信号覆盖区域可以被抽象成以用户为圆心的一系列扇形。已知每个扇形的半径 r,和每个扇形的两条边相对于正东方向的夹角度数。每个信号覆盖区域抽象出的扇形都可以通过从第一条边逆时针旋转到第二条边画出。
请计算一下,用户手机所有信号覆盖到的区域的总面积。
输入格式
第一行输入一个整数 T (1 ≤ T ≤ 20),表示数据组数。
接下来一共 T 组数据,每组数据第一行输入一个整数 n (1 ≤ n ≤ 104),表示各种信号可以抽象出的不同扇形的总个数。接下来输入 n 行,每行 3 个整数表示扇形半径 r (0 ≤ r ≤ 105)、扇形第一条边与正东方向的夹角 α、扇形第二条边与正东方向的夹角 β (-90 ≤ α ≤ β < 270)。
输出格式
输出 T 行,每行一个非负浮点数,表示用户手机所有信号覆盖到的区域的范围的总面积。
每组输出与标准答案绝对误差在 10-3 内均认为是正确的。
输入:
1 4 2 -30 32 3 20 81 3 121 160 2 141 201
输出:
11.030
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
const double pi = acos(-1.0);
struct node{
double r;
int a,b;
}no[N];
double maxr[N];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i = 0; i < n; ++i)
scanf("%lf%d%d",&no[i].r,&no[i].a,&no[i].b);
memset(maxr,0,sizeof(maxr));
for(int i = 0; i < n; ++i){
for(int j = no[i].a; j < no[i].b; ++j)
maxr[j+90] = max(maxr[j+90],no[i].r);
}
double s = 0;
for(int i = 0; i < 360; ++i){
s += maxr[i]*maxr[i];
}
printf("%.3lf\n",s/360*pi);
}
return 0;
}