题目:
绝地求生
时间限制: 1000ms 内存限制: 65535KB
通过次数: 5 总提交次数: 24
zbt最近喜欢上了《绝地求生》(pubg)游戏,pubg这个游戏有一种跑毒机制,每次会产生一个圆形的安全区,玩家需要从他的当前位置在一定时间内进入安全区,否则游戏就会失败。
zbt经常死于跑毒,于是他想设计一个程序来判断他是不是能够跑进安全区,如果不能他就直接退出游戏了,如果zbt的血量刚好到达安全区,依旧存活。
zbt现在有100点血和一辆载具,这辆载具有a点油量,每秒需要消耗b点油量前进c米,当载具没有油的时候他只能选择跑步前进,他跑步的话每秒可以跑d米,在毒里面他每秒会受到e点伤害(生命值每时每刻都在减少)。(题目保证载具的速度一定大于等于人跑步的速度)
输入包括两行。第一行有5个数,zbt现在的位置x,y;安全区的圆心位置 x1,y1; 安全区的半径r。第二行包括5个数,载具的油量a,每秒消耗的油量为b,载具速度为c,跑步的速度为d,在毒里每秒受到的伤害为e。
输出包括一行如果zbt成功进入安全区,输出到达的时间,保留3位小数,否则输出"GG"(没有双引号)。
数据范围:0<=a,b<=1000 , 0<=d<=c<=1000 , -1000<=x,x1,y,y1<=1000 , 0< r <=2000.
1 1 10 10 1 1 1 1 1 90
GG
思路:
先考虑是否就在圈里,若在圈里直接输出0。
之后考虑车的油够不够到达圈内,若能到,则考虑车走到圈花费的时间血条能不能撑住。
再考虑油不够需要步行的情况,先把在车上的时候血条就已经撑不住的情况排除,再考虑徒步走到圈花费的时间血条能不能撑住。
坑点:注意读题!“如果zbt的血量刚好到达安全区,依旧存活”
=》“zbt”means“装逼棠”?
#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ios::sync_with_stdio(false);double x,y,x1,y1,r;cin>>x>>y>>x1>>y1>>r;double a,b,c,d,e;cin>>a>>b>>c>>d>>e;double len = sqrt(fabs(x1-x)*fabs(x1-x) + fabs(y1-y)*fabs(y1-y))-r;double chetot = a/b*c;if(len<=0){printf("%.3lf\n",0);} else if(chetot >= len){if(len/c*e > 100){printf("GG\n");}else{printf("%.3lf\n",len/c);}}else{len = len-chetot;double blood = 100-chetot/c*e;double chetime = chetot/c;if(blood <0){printf("GG\n");}else{double s = len/d;if(s*e>blood){printf("GG\n");}else{double time = chetime+ len/d;printf("%.3lf\n",time);}}}return 0;
}