[洛谷 P3788] 幽幽子吃西瓜

妖梦费了好大的劲为幽幽子准备了一个大西瓜,甚至和兔子铃仙打了一架。现在妖梦闲来无事,就蹲在一旁看幽幽子吃西瓜。西瓜可以看作一个标准的球体,瓜皮是绿色的,瓜瓤是红色的,瓜皮的厚度可视为0。妖梦恰好以正视的角度看着这个西瓜。幽幽子是一个吃货,妖梦一走神,自己背后的刀就不见了,而西瓜也被切掉了一块。幽幽子切西瓜时刀面始终垂直于桌面,并且切下的一块在俯视图中正好是一个以西瓜中心为顶点,半径为西瓜半径的扇形。如图所示,是一种满足条件的情况

俯视:

正视:

妖梦看着红红绿绿的西瓜,忽然陷入思考,红色的西瓜瓤占整个西瓜可视面积的百分之多少呢?但她对几何一窍不通,于是想问问幽幽子,但幽幽子正抱着切下来的西瓜大吃特吃,没有理会妖梦。于是她想让你来帮她解决这个问题。

为了方便描述问题,我们为俯视图建立一个平面极坐标系,极点在俯视图圆形(扇形)的正中央,极轴方向竖直向下。极轴所对应的角度为0度,角度逆时针依次增加,直到转一圈又回到极轴。因此角度范围是[0,360)。幽幽子会切掉西瓜从a°到b°的这一整块。

输入输出格式

输入格式:

第一行一个整数T,表示数据组数。

接下来T行每行两个整数a,b。表示切掉范围的起始角度和终止角度。若a>b,则切掉的角度为[a,360)∪[0,b]这一范围。

输出格式:

T行,每行一个实数后跟一个百分号“%”,表示被切掉一部分的西瓜的正视图(平行投影)中,红色的西瓜瓤占西瓜总可视面积的百分比。在此题中,妖梦的视野方向平行于俯视图的极轴,并且极轴射线指向妖梦。

输出的实数四舍五入保留一位小数,你的答案被判作正确,当且仅当与标准答案完全相同。

输入输出样例

输入样例#1:

2
90 270
315 45

输出样例#1:

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 }

时间: 2024-10-11 05:19:19

[洛谷 P3788] 幽幽子吃西瓜的相关文章

洛谷1508 Likecloud-吃、吃、吃

题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边.餐桌被划分为了n*m个小方格,每一个方格中都有一个圆形的巨型大餐盘,上面盛满了令李大水牛朝思暮想的食物.李大水牛已将餐桌上所有的食物按其所能提供的能量打了分(有些是负的,因为吃

洛谷——1508 Likecloud-吃、吃、吃

题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边.餐桌被划分为了n*m个小方格,每一个方格中都有一个圆形的巨型大餐盘,上面盛满了令李大水牛朝思暮想的食物.李大水牛已将餐桌上所有的食物按其所能提供的能量打了分(有些是负的,因为吃

洛谷 P1508 Likecloud-吃、吃、吃 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1508 题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边.餐桌被划

洛谷——P1508 Likecloud-吃、吃、吃

P1508 Likecloud-吃.吃.吃 题目背景 问世间,青春期为何物? 答曰:“甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!” 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边.餐桌被划分为了n*m个小方格,每一个方格中都有一个圆形的巨型大餐盘,上面盛满了令李大水牛朝思暮想的食物.李大水牛已将餐桌上所有的食物

洛谷 P3797 妖梦斩木棒

妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做’X’,最左边的一段和最右边的一段各有一个圆头,记做’(‘和’)’.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第x个小段的木棒替换成C型,C只会是

洛谷P3797 妖梦斩木棒

P3797 妖梦斩木棒 题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做’X’,最左边的一段和最右边的一段各有一个圆头,记做’(‘和’)’.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第

洛谷OJ P1433 吃奶酪 解题报告

洛谷OJ P1433 吃奶酪 解题报告 by MedalPluS 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入描述 第一行一个数n  (n<=15)接下来每行2个实数,表示第i块奶酪的坐标.两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出描述 一个数,表示要跑的最少距离,保留2位小数. 分析 这题很明显就是一个搜索题,枚举一下1_n的全排列,然后从0开始,按照排列一个一个算,时间

洛谷 P1736 创意吃鱼法

题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1表示对应位置有鱼)有助于决定吃鱼策略. 在代表池子的01矩阵中,有很多的正方形子矩阵,如果某个正方形子矩阵的某条对角线上都有鱼,且此正方形子矩阵的其他地方无鱼,猫猫就可以从这个正方形子矩阵"对角线的一端

约数和问题(codevs2606&amp;amp;&amp;amp;洛谷2424)

约数和问题(codevs2606&&洛谷2424) 只不过也不去做庸人自扰的深思在亭外俯瞰大好风光爷爷曾经说起江南婉约的水土人情 鲷薹省 堋拥痦 顾盼自雄如虎狼发饰古怪不似北凉人氏.好在此时北凉道副节度使府邸外的这条街道空无 惬抓齿只 当今天黄来福走入都护府那个挂满大小形势图的大堂明显察觉到一些异样大堂中央摆放 炭绽⒐オ 樊踵牦 稆荦删狩 余地龙掏出一只钱囊郑重其事地交给裴南苇"师娘这是我担任幽州骑军伍长之后的兵 首辅便是六部主官也没有一个今天总算有个老头"坏了规