目录
Gym - 102021D:Down the Pyramid
Gym - 102021E :Expired License
Gym - 102021F :Fighting Monsters
Gym - 102021I: It’s Time for a Montage
题目链接:http://codeforces.com/gym/102021
Gym - 102021B: Battle Royale
题意:平面内有一个大圆,大圆里面有两个点(我假设A和B)和一个小圆,这个小圆在A,B之间。问从A到B的最短距离。(小圆和AB两点永远在大圆里面,并且AB两点不在小圆里面,并且走小圆的边缘也是允许的)
思路:示意图如下图所示,分析可知最短距离就是L1+L2+L3的值,其中L1,L2是三角形的弦,L3是圆的一段弧长。L1,L2好求,通过勾股定理即可,求L3时要用到弧长公式“ L=R*θ”(θ为弧度制)。所以求角度a2时,要求出其中的大角和两边的小角,相减即可得到a2。求出da求三个角度a1,a2,a3时,要用到acos(number)函数求角度(number为余弦值),最后即可求出L3的弧长。(自己做的是前面分析出图都很简单,就是求角度时不知道可以用这个函数,卡了半天)
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
int x1,y1,x2,y2,x0,y0,r0,x,y,r;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
scanf("%d%d%d",&x,&y,&r);
scanf("%d%d%d",&x0,&y0,&r0);
double len1=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
double len2=sqrt((x2-x0)*(x2-x0)+(y2-y0)*(y2-y0));
double len=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double ans1=sqrt(len1*len1-r0*r0);//弦L1
double ans2=sqrt(len2*len2-r0*r0);//弦L2
//ang为圆心角
double ang=acos((len1*len1+len2*len2-len*len)/(2*len1*len2));///加括号!!!
ang=ang-acos(r0/len1)-acos(r0/len2);
double ans=ans1+ans2+r0*ang;
printf("%.10lf\n",ans);
return 0;
}
小总结:1、就是求角函数 acos(number)其中number为余弦值,acos()所求的值为弧度制。2、用到除号“/”当分母有多项时一定记得加括号!!这些小细节真的很重要,有时候这些细节忘了一旦程序报错了很难找出自己哪错了。所以要重视这些细节。
Gym - 102021D:Down the Pyramid
题意:给你一层数,让你求出它下面的一层数,上面的每一个数都是下层相邻两个数的和。(就像图中的数字金字塔一样)。问你下面一层有多少种满足的方案。
思路:假设给出的值为,a1,a2,a3,a3...,假设下面的第一个数b0=x,那么可以推得第二个数b1=a1-x,第三个数就是a2-(a1-x),以此类推。其中bo...bn要满足的条件就是每一项都大于等于零。所以就可推得关于x 的不等式,所以就可以求出x的一个最小的范围,所以就可求出方案数。
其实这个思路一开始也没懂,但是在草稿纸上写了一下就突然明白了