[洛谷 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 }
View Code

 

转载于:https://www.cnblogs.com/whc200305/p/7076730.html

单向双向V2G 环境下分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)内容概要:本文介绍了在单向和双向V2G(Vehicle-to-Grid)环境下,分布式电源与电动汽车充电站的联合配置方法,并提供了基于Matlab的代码实现。研究涵盖电力系统优化、可再生能源接入、电动汽车充放电调度、储能配置及微电网经济调度等多个关键技术领域,重点探讨了在不同电价机制和需求响应策略下,如何通过智能优化算法实现充电站与分布式电源的协同规划与运行优化。文中还展示了多种应用场景,如有序充电调度、鲁棒优化模型、多目标优化算法(如NSGA-II、粒群算法)在电力系统中的实际应用,体现了较强的工程实践价值和技术综合性。; 适合人群:具备电力系统、新能源、智能优化算法等相关背景的科研人员、研究生及从事能源系统规划与优化的工程技术人员;熟悉Matlab/Simulink仿真工具者更佳。; 使用场景及目标:①用于科研项目中关于电动汽车与分布式电源协同配置的模型构建与仿真验证;②支持毕业论文、期刊投稿中的案例分析与算法对比;③指导实际电力系统中充电站布局与能源调度的优化设计。; 阅读建议:建议结合文中提供的Matlab代码与具体案例进行同步实践,重点关注优化模型的数学建模过程与算法实现细节,同时可参考文末网盘资源获取完整代码与数据集以提升学习效率。
【电动车】【超级棒】基于蒙特卡洛模拟法的电动汽车充电负荷研究(Matlab代码实现)内容概要:本文围绕基于蒙特卡洛模拟法的电动汽车充电负荷研究展开,利用Matlab代码实现对不同类型电动汽车(如常规充电、快速充电、换电模式)在不同场景下的充电负荷进行建模与仿真。通过蒙特卡洛方法模拟大量电动汽车的充电行为,结合用户出行规律、充电时间、电量需求等随机因素,分析电动汽车规模化接入电网后对电力系统负荷的影响,并探讨分时电价策略对充电负荷的引导作用,进而优化电网运行。研究涵盖充电负荷的空间分布特性、时间分布特征及对电网峰谷差的影响,旨在为电力系统规划和电动汽车有序充电管理提供理论支持和技术工具。; 适合人群:具备一定电力系统、交通工程或新能源汽车背景的研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。; 使用场景及目标:①用于研究大规模电动汽车接入对配电网负荷曲线的影响;②支撑分时电价、需求响应等政策制定与优化;③为充电站规划、电网调度、储能配置等提供数据支持和仿真平台;④适用于学术研究、课题复现及工程项目前期分析。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注蒙特卡洛模拟的参数设置、充电行为的概率建模过程,并尝试调整输入变量以观察负荷变化趋势,加深对电动汽车充电负荷不确定性和聚合效应的理解。
先展示下效果 https://pan.quark.cn/s/43dfb91c1388 在Android开发领域中,`SurfaceView`被视为一种关键性的视图组件,它特别适用于处理需要高性能且低延迟的图形操作,例如游戏运行和视频播放等。 本篇内容将详细研究如何运用`SurfaceView`来制作动画效果,并涵盖相关的技术要点。 我们必须明确`SurfaceView`的基本属性。 与常规的`View`不同,`SurfaceView`拥有专属的绘图表面,该表面独立于应用程序窗口的堆叠结构,而是在窗口管理器中直接创建一个独立的层级。 这种构造方式使得`SurfaceView`能够提供更迅捷的渲染速度,因为它不受窗口重绘过程的影响。 这对于需要持续更新的动画来说具有显著的优势。 构建`SurfaceView`动画的核心在于`SurfaceHolder`接口,该接口作为`SurfaceView`的持有者,提供了对底层`Surface`的访问权限以及回调机制。 开发者可以通过监听`SurfaceCreated`、`SurfaceChanged`和`SurfaceDestroyed这三个事件来管理和控制动画的生命周期。 1. **SurfaceCreated**:当`Surface`准备妥当时触发,这是开始进行绘制的理想时机。 在此阶段初始化动画逻辑,例如设定帧率、载入图像资源等。 2. **SurfaceChanged**:当`Surface`的尺寸或格式发生变动时触发,比如设备屏幕发生旋转。 你需要在此处调整动画的尺寸以适应新的屏幕布局。 3. **SurfaceDestroyed**:当`Surface`变得不可用时触发,可能是`SurfaceView`被移除或系统资源得到回收。 此时,应该...
棋是一种非常经典的棋类游戏,玩家和电脑轮流下棋,先将三个棋连成一条线的一方获胜。下面是洛谷p1838三棋C语言的代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 3 #define COL 3 void Initboard(char arr[ROW][COL], int row, int col) { int i, j; for (i = 0; i < row; i++) for (j = 0; j < col; j++) arr[i][j] = ' '; } void Displayboard(char arr[ROW][COL], int row, int col) { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", arr[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("\n"); } } } void Player_p(char arr[ROW][COL], int row, int col) { printf("玩家下:>\n"); int i, j; scanf("%d%d", &i, &j); while (i > row || i < 1 || j > col || j < 1) { printf("坐标非法,请重输:\n"); scanf("%d%d", &i, &j); } while (arr[j - 1][i - 1] == '#' || arr[j - 1][i - 1] == '*') { printf("坐标已被占用,请重新输入:\n"); scanf("%d%d", &i, &j); } arr[j - 1][i - 1] = '*'; } void Computer_p(char arr[ROW][COL], int row, int col) { printf("电脑下:>\n"); int i, j; srand((unsigned int)time(NULL)); while (1) { i = rand() % row; j = rand() % col; if (arr[i][j] == ' ') { arr[i][j] = '#'; break; } } } char Checkwin(char arr[ROW][COL], int row, int col) { int i; for (i = 0; i < row; i++) { if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ') return arr[i][0]; } for (i = 0; i < col; i++) { if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ') return arr[0][i]; } if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ') return arr[0][0]; if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ') return arr[0][2]; if (i == row && i == col) return 'q'; return ' '; } int main() { char board[ROW][COL]; char ret; Initboard(board, ROW, COL); Displayboard(board, ROW, COL); while (1) { Player_p(board, ROW, COL); Displayboard(board, ROW, COL); ret = Checkwin(board, ROW, COL); if (ret != ' ') { break; } Computer_p(board, ROW, COL); Displayboard(board, ROW, COL); ret = Checkwin(board, ROW, COL); if (ret != ' ') { break; } } if (ret == '*') { printf("玩家获胜!\n"); } else if (ret == '#') { printf("电脑获胜!\n"); } else { printf("平局!\n"); } return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值