German Collegiate Programming Contest 2018(GCPC)

目录

Gym - 102021B: Battle Royale

Gym - 102021D:Down the Pyramid

 Gym - 102021E :Expired License

 Gym - 102021F :Fighting Monsters

 Gym - 102021I: It’s Time for a Montage

Gym - 102021L: Logic Puzzle 


题目链接: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的一个最小的范围,所以就可求出方案数。

其实这个思路一开始也没懂,但是在草稿纸上写了一下就突然明白了࿰

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值