计蒜客 初赛 第三场 A题:腾讯手机地图

腾讯手机地图的定位功能用到了用户手机的多种信号,这其中有的信号的作用范围近,有的信号作用的范围则远一些。有的信号相对于用户在不同的方位强度是不同的,有的则是在任何一个方向上信号强度都一致的。

已知用户面向北方拿着自己的手机,在不同方位的各种信号覆盖区域可以被抽象成以用户为圆心的一系列扇形。已知每个扇形的半径 r,和每个扇形的两条边相对于正东方向的夹角度数。每个信号覆盖区域抽象出的扇形都可以通过从第一条边逆时针旋转到第二条边画出。

这里写图片描述
输入格式

请计算一下,用户手机所有信号覆盖到的区域的总面积。

第一行输入一个整数 T (1 ≤ T ≤ 20),表示数据组数。

接下来一共 T 组数据,每组数据第一行输入一个整数 n (1 ≤ n ≤ 104),表示各种信号可以抽象出的不同扇形的总个数。接下来输入 n 行,每行 3 个整数表示扇形半径 r (1 ≤ r ≤ 105)、扇形第一条边与正东方向的夹角 α、扇形第二条边与正东方向的夹角 β (-90 ≤ α ≤ β < 270)。

输出格式

输出 T 行,每行一个非负浮点数,表示用户手机所有信号覆盖到的区域的范围的总面积。

每组输出与标准答案绝对误差在 10-3 内均认为是正确的。

样例1
输入:

1 4 2 -30 32 3 20 81 3 121 160 2 141 201

输出:

11.030

由于输入的角度都是整数范围,所以在覆盖的区域中可以将整个范围平均分成360个小扇形,R[i]代表从第i度到第i+1角度的扇形。,然后根据每一组数据更新扇形的半径。
最后将360个扇形的总面积求出来即可

这题要求绝对误差在10^-3以内,所以π的精度还是很重要的,多保留几位小数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define PI 3.1415926535897932384626

double R[361];

int main()
{
    int T,num;
    double sum = 0.0;
    int Rad,l,r;
    scanf("%d",&T);
    while(T--)
    {
        sum = 0;
        cin>>num;
        memset(R,0,sizeof(R));
        for (int k =1; k<=num; k++)
        {
            cin>>Rad>>l>>r;
            l+=90;
            r+=90;
            for(int i = l; i<r; i++)
                R[i] = max(R[i],(double)Rad);
        }
        for(int i = 0;i<360;i++)
            sum += PI/360 * R[i] * R[i];
        printf("%.10lf\n",sum);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值