[洛谷 P3788] 幽幽子吃西瓜
妖梦费了好大的劲为幽幽子准备了一个大西瓜,甚至和兔子铃仙打了一架。现在妖梦闲来无事,就蹲在一旁看幽幽子吃西瓜。西瓜可以看作一个标准的球体,瓜皮是绿色的,瓜瓤是红色的,瓜皮的厚度可视为0。妖梦恰好以正视的角度看着这个西瓜。幽幽子是一个吃货,妖梦一走神,自己背后的刀就不见了,而西瓜也被切掉了一块。幽幽子切西瓜时刀面始终垂直于桌面,并且切下的一块在俯视图中正好是一个以西瓜中心为顶点,半径为西瓜半径的扇形。如图所示,是一种满足条件的情况
俯视:
正视:
妖梦看着红红绿绿的西瓜,忽然陷入思考,红色的西瓜瓤占整个西瓜可视面积的百分之多少呢?但她对几何一窍不通,于是想问问幽幽子,但幽幽子正抱着切下来的西瓜大吃特吃,没有理会妖梦。于是她想让你来帮她解决这个问题。
为了方便描述问题,我们为俯视图建立一个平面极坐标系,极点在俯视图圆形(扇形)的正中央,极轴方向竖直向下。极轴所对应的角度为0度,角度逆时针依次增加,直到转一圈又回到极轴。因此角度范围是[0,360)。幽幽子会切掉西瓜从a°到b°的这一整块。
输入输出格式
输入格式:
第一行一个整数T,表示数据组数。
接下来T行每行两个整数a,b。表示切掉范围的起始角度和终止角度。若a>b,则切掉的角度为[a,360)∪[0,b]这一范围。
输出格式:
T行,每行一个实数后跟一个百分号“%”,表示被切掉一部分的西瓜的正视图(平行投影)中,红色的西瓜瓤占西瓜总可视面积的百分比。在此题中,妖梦的视野方向平行于俯视图的极轴,并且极轴射线指向妖梦。
输出的实数四舍五入保留一位小数,你的答案被判作正确,当且仅当与标准答案完全相同。
输入输出样例
2 90 270 315 45
0.0% 70.7%
说明
样例说明:
第一个样例中,切掉的西瓜恰好在背面,在妖梦的角度看起来与未切过的西瓜并无区别,因此输出0%。第二个样例中,切掉了从315°~45°这一部分,经过计算,得到答案为sqrt(2)/2,化成小数得到0.707,即70.7%
本题目共有10个测试点。
对于第1个测试点,a,b∈{0,90,180,270}。
对于第2个测试点,270<=a<=359,0<=b<=90。
对于第3,4个测试点,180<=a<=359,0<=b<=179。
对于全部测试点,0<=a,b<=359,a≠b。
1<=T<=10000
PS:本题实在太玄。。。
首先,要看懂题目的意思,题目就是说给你一个西瓜,给出俯视图,并在俯视图上向瓜心方向切2刀,每一刀的距离都是瓜的半径。要你求出,在正视图中,红色的面积是正视图
面积的多少。
出题者很友善地给出了部分特殊情况,那我们一起来分析下:
10%:
由于a,b∈{0,90,180,270},我们可以全用来特判;
20%(10%+10%):
由于270<=a<=359,0<=b<=90,说明正视图的总面积是π*r*r。那么,我们只需求出红色的总面积,具体见下;
40%(10%+10%+20%):
这种情况就开始比较复杂了,可以自己推一下;
100%:
本蒟蒻仍然将每种情况都推了一遍。。。唯一要注意的是,一定要把目光放在留下来的西瓜上面,见下。
另外的:注意cmath里的sin什么的都是弧度,我们要把角度转成弧度再用,弧度=π*角度/180°。
代码如下:
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const double pi=3.14159265358980; 7 inline int read(){ 8 int x=0; char ch=getchar(); 9 while (ch<'0'||ch>'9') ch=getchar(); 10 while (ch>='0'&ch<='9') x=x*10+ch-'0',ch=getchar(); 11 return x; 12 } 13 double chg(int x){ 14 return pi*x/180; 15 } 16 void situ1(int d1,int d2){ 17 if (d1==0||d2==0){ 18 if (d1==0){if (d2==90) puts("50.0%"); else puts("0.0%");} 19 else{if (d1==270) puts("50.0%"); else puts("0.0%");} 20 }else 21 if (d1==90||d2==90){ 22 if (d1==90) puts("0.0%"); else puts("100.0%"); 23 }else 24 if (d1==180||d2==180){ 25 if (d1==180) puts("0.0%"); else puts("100.0%"); 26 } 27 } 28 void situ2(int d1,int d2){ 29 double del=chg(360-d1),ret=sin(del); 30 del=chg(d2),ret+=sin(del),ret*=100/2; 31 printf("%.1f%c\n",ret,'%'); 32 } 33 void situ3(int d1,int d2){ 34 if (d1<=270&&d2>=90) puts("100.0%"); 35 else{ 36 double del=chg(90-abs(270-d1)),ret=0,tot=0; if (d1!=180) ret=sin(del); 37 if (d1>=270) tot=1; else tot=ret; 38 del=chg(90-abs(90-d2)),ret+=sin(del); 39 if (d2<=90) tot+=1; else tot+=sin(del); 40 ret=ret/tot*100; 41 printf("%.1f%c\n",ret,'%'); 42 } 43 } 44 void situelse(int d1,int d2){ 45 double del=0,ret=0,tot=0; 46 if (d1<d2){ 47 if (0<=d1&&d1<90){ 48 if (90-d1<=d2-90) puts("0.0%"); 49 else{ 50 if (d2<=90) del=chg(d2),ret=sin(del),tot++; 51 if (d2>90) del=chg(180-d2),tot=ret=sin(del); 52 del=chg(d1),ret-=sin(del),tot++; 53 ret=ret/tot*100; 54 printf("%.1f%c\n",ret,'%'); 55 } 56 }else 57 if (90<=d1&&d1<180) puts("0.0%"); else 58 if (180<=d1&&d1<270){ 59 if (270-d1>=d2-270) puts("0.0%"); 60 else{ 61 del=chg(d1-180),tot=ret=sin(del),tot++; 62 del=chg(360-d2),ret-=sin(del); 63 ret=ret/tot*100; 64 printf("%.1f%c\n",ret,'%'); 65 } 66 }else 67 if (270<=d1&&d1<360){ 68 del=chg(360-d1),ret=sin(del),tot=2; 69 del=chg(360-d2),ret-=sin(del); 70 ret=ret/tot*100; 71 printf("%.1f%c\n",ret,'%'); 72 } 73 }else{ 74 if (0<d1&&d1<=90){ 75 del=chg(d1),tot=sin(del); 76 del=chg(d2),ret=sin(del); 77 ret=ret/tot*100; 78 printf("%.1f%c\n",ret,'%'); 79 }else 80 if (90<d1&&d1<=180){ 81 if (d2>=90) puts("100.0%"); else{ 82 tot=1; 83 del=chg(d2),ret=sin(del); 84 ret=ret/tot*100; 85 printf("%.1f%c\n",ret,'%'); 86 } 87 }else 88 if (180<d1&&d1<=270){ 89 del=chg(d1-180),ret=sin(del),tot++; 90 if (90<=d2) ret=tot=1; 91 if (0<d2&&d2<90) del=chg(d2),ret+=sin(del),tot++; 92 ret=ret/tot*100; 93 printf("%.1f%c\n",ret,'%'); 94 }else 95 if (270<d1&&d1<360){ 96 del=chg(360-d1),ret=sin(del),tot++; 97 if (270<d2) del=chg(360-d2),tot=sin(del); 98 if (90<=d2&&d2<180) del=chg(180-d2),ret+=sin(del),tot+=sin(del); 99 if (0<d2&&d2<90) del=chg(d2),ret+=sin(del),tot++; 100 ret=ret/tot*100; 101 printf("%.1f%c\n",ret,'%'); 102 } 103 } 104 } 105 inline void _solve(){ 106 int dg_s=read(),dg_t=read(); 107 if (dg_s%90==0&&dg_t%90==0) situ1(dg_s,dg_t); else 108 if (270<=dg_s&&dg_s<360&&0<=dg_t&&dg_t<=90) situ2(dg_s,dg_t); else 109 if (180<=dg_s&&dg_s<360&&0<=dg_t&&dg_t<180) situ3(dg_s,dg_t); else 110 situelse(dg_s,dg_t); 111 } 112 int main(){ 113 for (int T=read(); T; T--) _solve(); 114 return 0; 115 }
View Code
转载于:https://www.cnblogs.com/whc200305/p/7076730.html
[洛谷 P3788] 幽幽子吃西瓜相关推荐
- 洛谷P2431正妹吃月饼
刷题之路-数论 洛谷P2431正妹吃月饼 传送门 题目描述 做题思路 将a转换成二进制,然后从最小位开始,对每一位进行判断:若为0,则转换为1,若转换后大于b,则结束,否则继续.最后对a中的1的个数进 ...
- 洛谷 P3131 [USACO16JAN]子共七Subsequences Summing to Sevens
P3131 [USACO16JAN]子共七Subsequences Summing to Sevens 题目描述 Farmer John's NN cows are standing in a row ...
- 洛谷 P2431 正妹吃月饼
题目描述 今天是中秋节.uim带来了一堆大小不同且味道各异的月饼. 这些月饼的质量分别是1g,2g,4g,8g,16g....后面一个是前面的2倍.每种只有一个. uim让正妹随便吃. 正妹希望尝试尽 ...
- 洛谷 P2431 正妹吃月饼 解题报告
P2431 正妹吃月饼 题目描述 今天是中秋节.\(uim\)带来了一堆大小不同且味道各异的月饼. 这些月饼的质量分别是\(1g\),\(2g\),\(4g\),\(8g\),\(16g\)....后 ...
- 洛谷 P1508 Likecloud-吃、吃、吃
采用的动态规划 状态:f[i][j]表示李大水牛走到格子(i,j)时能获得的最大价值 转移:f[i][j]=max(max(f[i+1][j+1],f[i+1][j]),f[i+1][j-1])+a[ ...
- (每日水题004-1)(DP,滚动数组)洛谷P1508 Likecloud-吃、吃、吃
一.算法分析 乍一看本题有些没有头绪,本题的特点是终点为第一行的任意数,而起点在最后一行,和常见的题相较是反的,而且起点也不在该行的第一个,而是在中间...开始的想法是从起点开始找,但是发现很麻烦,但 ...
- 洛谷P3797 妖梦斩木棒
题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的 ...
- 洛谷 P3797 妖梦斩木棒
妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都 ...
- 洛谷 P3797 妖梦斩木棒 解题报告
P3797 妖梦斩木棒 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的\(n\)段.现在这个木棒可以看做 ...
最新文章
- java 高级数据类型_【高级数据类型】- 2.通道的更多种类
- CVPR 2017 全部及部分论文解读集锦
- dev chartcontrol获取x y轴的值_2020年深圳蛇口x情怀当铺展览详情(时间+地点+门票)...
- Tkinter的Scrollba组件
- django自定义过滤器及模板标签
- CSVN部署安装,实现web管理svn
- java requestbody map_@RequestBody 的正确使用办法
- jquery对象和DOM对象的相互转换详解
- python从数据库取数据 显示字段名_如何在python中将SQL数据库中的字段名放入列表中...
- grunt 前端开发环境搭建
- ansible 容器部署_如何使用Ansible Container管理Linux容器
- CSDN如何找到自己关注的博客专栏
- Oracle 11g Rac搭建
- 墨卡托投影参数设置_[转载]MRT投影参数设置及原理
- 1000款水墨墨迹毛笔素材
- Google guava学习
- 微信页面隐藏分享按钮
- uniapp生成随机数字
- 区块链游戏,不懂你别玩!
- FIR.im Weekly - 这是多产的一周