中北大学NUC2017新生赛1010/NOJ-1990

题目:

绝地求生

时间限制: 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

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;
}


你可能感兴趣的:(2017中北大学NUC新生赛)