计蒜之道 初赛 第三场--腾讯手机地图 题解
来源:互联网 发布:淘宝网页设计模板 编辑:程序博客网 时间:2024/06/10 09:07
题目大意是:
在坐标系里给你n个扇形的半径、起始,结束度数,计算扇形覆盖的面积。
如图:
(因为现在无法提交了,所以无法验证代码,若有错的地方请指正)
这题首先要做的是对边的度数排序,不过是对所有度数排序,最开始想的时候只对扇形开始边的那个度数排序,写了半天一堆if else,后来突然想到了用所有边的度数排序。
首先需要对输进去每每条边度数进行处理,我用的是这个结构体
struct DU{int du;//度数int r;//当前度数所对应的半径bool if_end;//是否为扇形的结束边int num;//扇形编号}a[MAX];
进行面积计算首先对a[]进行排序,接下来需要用到一些变量:
一个set集合,记录扇形的半径;
一个标记变量R,记录当前已有半径中最大的那个;
记录起始,结束边的度数变量start,end;
面积s;
struct SET_R{int r;//半径int num;//半径对应的扇形 bool operator < (const dd &a) const { return du<=a.du; }};set<SET_R> set_r;// 记录扇形的半径set<SET_R>::iterator it;int R;// 当前已有半径中最大的那个,即set_r.begin()int start,end;// 起始,结束边的度数变量start,endint s;SET_R temp;
下面循环计算面积
从小到大扫描边的度数:
1. set_r 不为空:
当前边半径r>=R,更新end,计算从start到end的面积,更新start;
否则,更新start;
2. 更新set_r,遇到起始边把半径加入set_r,更新R;遇到结束边把此边对应半径从set_r删除,更新R
for(i=0;i<n;i++){if(set_r.empty()==false ){if(R<=a[i].r )//如果当前边的半径r>=R{end=a[i].du;//更新ends+=(end-start)*R*R*PI/360;//计算面积,注意需要对减法处理一下start=end;//更新start}}else{start=a[i].du;}//更新set_rtemp.r=a[i].r;temp.num=a[i],num;if(a[i].if_end==false){set_r.insert(temp);}else{set_r.erase(temp);}//更新Rif(set_r.empty()==false){it=set_r.begin();R=(*it).r;}}
下面就以实际的例子来说明吧,这个例子包含了所有可能的情况。
比如给的扇形是:
10 10 120
25 20 40
25 80 100
20 30 90
5 70 150
如图
对这组数进行整理后得到如下数组 (红色为结束边)
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
扫描[0]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为Set_r为空
所以start=a[i].du
2
更新set_r
set_r
10
R=10;
扫描[1]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R<= a[i].r && set_r不空
所以end=a[i].du
S+=(end-start)*R*R*PI/360; //计算面积,注意需要对减法处理一下
Start=a[i].du
2
更新set_r
set_r
25
10
R=25;
计算得到蓝色部分面积
扫描[2]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R>a[i].r ,跳过
2
更新set_r
set_r
25
20
10
R=25;
扫描[3]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R<= a[i].r && set_r不空
所以end=a[i].du
S+=(end-start)*R*R*PI/360; //计算面积,注意需要对减法处理一下
Start=end
2
更新set_r
set_r
20
10
R=20;
计算得到蓝色部分面积
扫描[4]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R> a[i].r ,跳过
2
更新set_r
set_r
20
10
5
R=20
扫描[5]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R<= a[i].r && set_r不空
所以end=a[i].du
S+=(end-start)*R*R*PI/360; //计算面积,注意需要对减法处理一下
Start=end
2
更新set_r
set_r
25
20
10
5
R=25;
计算得到蓝色部分面积
扫描[6]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R>a[i].r ,跳过
2
更新set_r
set_r
25
10
5
扫描[7]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R<= a[i].r && set_r不空
所以end=a[i].du
S+=(end-start)*R*R*PI/360; //计算面积,注意需要对减法处理一下
Start=end
2
更新set_r
set_r
10
5
R=10;
计算得到蓝色部分面积
扫描[8]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R<= a[i].r && set_r不空
所以end=a[i].du
S+=(end-start)*R*R*PI/360; //计算面积,注意需要对减法处理一下
Start=end
2
更新set_r
set_r
5
R=5;
计算得到蓝色部分面积
扫描[9]
1
0
1
2
3
4
5
6
7
8
9
度数
10
20
30
40
70
80
90
100
120
150
半径
10
25
20
25
5
25
20
25
10
5
因为R<= a[i].r && set_r不空
所以end=a[i].du
S+=(end-start)*R*R*PI/360; //计算面积,注意需要对减法处理一下
Start=end
2
更新set_r
set_r
计算得到蓝色部分面积
- 计蒜之道 初赛 第三场--腾讯手机地图 题解
- 2017 计蒜之道 初赛 第三场-A. 腾讯课堂的物理实验
- 2017 计蒜之道初赛第三场 A.腾讯课堂的物理实验
- [最大密度子图] 2017 计蒜之道 初赛 第三场 腾讯狼人杀
- 2017 计蒜之道 初赛 第三场 A. 腾讯课堂的物理实验
- 2017 计蒜之道 初赛 第三场 腾讯狼人杀(简单)(暴搜)
- [最大密度子图] 2017 计蒜之道 初赛 第三场. 腾讯狼人杀
- 2017计蒜之道程序设计大赛初赛第三场题解
- 计蒜之道 初赛 第二场 题解 树形dp
- 2017 计蒜之道初赛第五场题解
- 2017 计蒜之道初赛第六场 题解
- 2017 计蒜之道 初赛 第三场
- 2017 计蒜之道 初赛 第三场 A+B
- 2017 计蒜之道 初赛 第三场
- 计蒜客 初赛 第三场 A题:腾讯手机地图
- 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树
- 2016 计蒜之道 初赛 第一场 题解(待补)
- 2017计蒜之道程序设计大赛初赛第一场题解
- 从Android到iOS开发——(1)、objective-c与java语法对比
- mybatis 源码系列 组件之 logging
- [LeetCode]Contains Duplicate
- 实现参数传值的几种方式
- 1014 装箱问题
- 计蒜之道 初赛 第三场--腾讯手机地图 题解
- 我的Android进阶之旅------>Android系统设置默认来电铃声、闹钟铃声、通知铃声
- 时间转换成字符串
- 将yyyy-dd-MM hh:mm:ss字符串格式的时间转换为毫秒
- 置换过时sizeWithFont:在iOS的7
- SQL Server 2012 链接本地服务器失败
- apache虚拟主机配置
- WCF 设计和实现服务协定(01)
- C#面试题整理2