计蒜之道2015程序设计大赛初赛第三场——腾讯手机地图

计蒜之道2015程序设计大赛初赛第三场——腾讯手机地图

(一)题面

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

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

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

输入格式

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

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

输出格式

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

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

样例1

输入:

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

输出:

11.030

(二)参考源码

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.text.DecimalFormat;
 5 import java.util.Arrays;
 6
 7 public class Main {
 8     private static final BufferedReader READER = new BufferedReader(
 9             new InputStreamReader(System.in));
10     private static final DecimalFormat _0_000 = new DecimalFormat("0.000");
11
12     private static int readInt() throws IOException {
13         return Integer.parseInt(READER.readLine());
14     }
15
16     private static int[] readIntArray() throws IOException {
17         String[] stringArray = READER.readLine().split(" ");
18         int[] intArray = new int[stringArray.length];
19         for (int i = 0; i < stringArray.length; i++) {
20             intArray[i] = Integer.parseInt(stringArray[i]);
21         }
22         return intArray;
23     }
24
25     public static void main(String[] args) throws Exception {
26         int testCount = readInt();
27         int[] degreeArray = new int[361];
28         while (testCount-- > 0) {
29             long area = 0;
30             Arrays.fill(degreeArray, 0);
31             int lineCount = readInt();
32             while (lineCount-- > 0) {
33                 int[] intArray = readIntArray();
34                 for (int i = intArray[1]; i < intArray[2]; i++) {
35                     int j = i + 90;
36                     if (degreeArray[j] < intArray[0]) {
37                         degreeArray[j] = intArray[0];
38                     }
39                 }
40
41             }
42             for (int i = 0; i < 360;) {
43                 int r = degreeArray[i];
44                 if (r == 0) {
45                     i++;
46                     continue;
47                 }
48                 int begin = i;
49                 int end = i + 1;
50                 for (int j = end; j < 361; j++) {
51                     if (degreeArray[j] != r) {
52                         end = j;
53                         break;
54                     }
55                 }
56                 // r虽然是整数范围的,但是(end -
57                 // begin)*r*r会超过整数的范围,所以计算时,先将(end-begin)转化成long
58                 area += (long) (end - begin) * r * r;
59                 i = end;
60             }
61             System.out.println(_0_000.format(area * Math.PI / 360));
62         }
63     }
64 }

Java

时间: 2024-10-06 22:56:20

计蒜之道2015程序设计大赛初赛第三场——腾讯手机地图的相关文章

计蒜之道2015程序设计大赛初赛第四场——爱奇艺的自制节目

计蒜之道2015程序设计大赛初赛第四场——爱奇艺的自制节目 (一)题面 爱奇艺作为一家视频网站巨头,要为上亿的用户每天都提供“悦享品质”的服务.除了引进一些优秀的影视作品外,爱奇艺还做了一些诸如奇葩说.晓松奇谈的自制节目.爱奇艺最近又准备制作四档新的节目,它们分别是 W, X, Y, Z:但是现在能用来录这些节目的演播室只有两个,分别是演播室 A 和演播室 B. W 节目的现场搭建比较复杂,每一期都要在演播室 A 来录制,X 节目的摄影机位调整会影响节目质量,每一期都固定在演播室 B 来录制.而

计蒜之道2015程序设计大赛初赛第一场——搜狗输入法的分词算法

(一)题面 计蒜之道2015程序设计大赛初赛第一场——搜狗输入法的分词算法 搜狗输入法最近的用户输入中出现了一种新的输入模式,形如 “0k1234567”,搜狗的工程师发现这一模式后了解到,这是一种新被提出的对于十五进制数字的标记模式,其中 “0k” 是标记进制为15的前缀标记,之后的部分 “1234567” 是实际的十五进制的数字串. 在发现这一标记模式后,搜狗的工程师开始尝试在已有的分词算法上进一步加入对于十五进制数字串的处理,把网页上的这种形式的 15 进制数正确地提取出来.我们知道,标记

计蒜之道2015程序设计大赛初赛第二场——人人都有极客精神

计蒜之道2015程序设计大赛初赛第二场——人人都有极客精神 (一)体面 人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目.海盗旗下方的电子屏显示的日期形式为 YYYYMMDD (年份占 4 位.月份占 2 位.天数占 2 位). 日期电子屏幕上每个数字对应的显示如下图: 从上图可以得知每个数字对应的笔画数,比如 2 的笔画数是 5,8 的笔画数是 7

计蒜之道 初赛 第三场--腾讯手机地图

题目大意是: 在坐标系里给你n个扇形的半径.起始,结束度数,计算扇形覆盖的面积. 如图: (因为现在无法提交了,所以无法验证代码,若有错的地方请指正) 这题首先要做的是对边的度数排序,不过是对所有度数排序,最开始想的时候只对扇形开始边的那个度数排序,写了半天一堆if else,后来突然想到了用所有边的度数排序. 首先需要对输进去每每条边度数进行处理,我用的是这个结构体 struct DU { int du;//度数 int r;//当前度数所对应的半径 bool if_end;//是否为扇形的结

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务 1 /* QYP kuai wo dai ma*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<iomanip> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cstdio> 8 #include<queue> 9 #include<ctime

2017计蒜之道 初赛 第二场 百度的科学计算器(简单)

/** 题目:2017计蒜之道 初赛 第二场 百度的科学计算器(简单) 链接:https://nanti.jisuanke.com/t/15504 题意:给一个合法的表达式,包含加号+.减号-.括号().数字常量,表达式中没有空格. 输入数据保证数字常量以及计算过程中数值绝对值均不超过 10^12??,对于浮点型数值常量,保证小数点后不超过 666 位. 思路:暴力模拟:python有函数可以直接调用. 坑点:如果表达式中出现过浮点数,那么输出结果保留6位小数, 否则输出整数,不出现小数. */

hdu 5253 连接的管道(kruskal)(2015年百度之星程序设计大赛 - 初赛(2))

连接的管道 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1323    Accepted Submission(s): 519 Problem Description 老 Jack 有一片农田.以往几年都是靠天吃饭的. 可是今年老天格外的不开眼.大旱.所以老 Jack 决定用管道将他的全部相邻的农田全部都串联起来.这样他就能够从远处

2014年百度之星程序设计大赛 - 初赛(第二轮)Chess

题目描述:小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字路线.也就是说,如果"王"当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2) 这八个点中的任意一个. 小度觉得每次都是小良赢,没意思.为了难倒小良,他想出

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆