点击打开链接
总所周知,qwf是计算机学院最帅的人,他的粉丝很多,
而qwf对他的粉丝并不热情,甚至有时躲着粉丝们,
但他很腼腆,不会拒绝狂热的粉丝们。
现在qwf遇到了危机,n名粉丝在他身后追赶他,而他却和chj约好回寝室玩游戏,
只要qwf被其中一个狂热的粉丝追上,粉丝就会索要签名,并瞬间召唤来更多狂热的qwf爱好者,
也就是说,只要被粉丝追上,qwf就会被粉丝所掩埋,不能回寝室找chj了。
现在qwf在S点 寝室在E点 以速度V直线飞奔至寝室
粉丝i(1-n)在Si点 以速度Vi追赶qwf
qwfz在抵达寝室的瞬间被追上是没关系的,因为chj会把粉丝抵挡在门外
有些粉丝可能太激动,站在原地速度为0
如果qwf可以顺利回到寝室就输出“winner winner chicken dinner!!”
否则输出“haojie help me!!”
输入输出格式
输入格式:第一行:N 表示接下来有N组数据
每组数据
第一行:n S E V接下来n行:Si Vi 表示第i个粉丝的初始位置和速度N<150;n<=1000;(-2^30)<Si<S<E<(2^30)(-2^30)<V,Vi<(2^30)
输出格式:
对于每组数据,如果qwf可以顺利回到寝室就输出“winner winner chicken dinner!!”
否则输出“haojie help me!!”
输入输出样例
输入样例#1: 复制22 0 8 2-8 4-16 52 0 8 2-8 5-16 5
输出样例#1: 复制
winner winner chicken dinner!!haojie help me!!
本题实际上就是一个很普通的追及问题,只需要算出qwf到寝室的时间和粉丝到寝室的时间,如果qwf的时间t小于等于所有粉丝到达他寝室的时间,他就不会被淹没了。(解题思路)
代码实现如下:
#include<iostream>using namespace std;int main(){int N;cin>>N;while (N--){long long n,S,E,coun=0,V;double t1,len;cin>>n>>S>>E>>V;len=E-S;t1=len*1.000000/V;for(int i=0;i<n;i++){long long int s,v;double t,len1;cin>>s>>v;len1=E-s;if(v==0)continue;t=len1*1.000000/v;if(t<t1) coun=1;}if(coun==0)cout<<"winner winner chicken dinner!!"<<endl;else cout<<"haojie help me!!"<<endl;}}
但是在此处发现一个问题,在比赛的时候,代码的长度应当尽量精简。像上面代码中,qwf和粉丝与寝室的距离和速度完全可以用len,v两个变量所代替,而我所写的用了4个,增加了代码的长度,但相比于考试时给出的ac代码,却少了程序的运行时间,这是我很奇怪的,现将ac代码贴于下,希望有大神能够给答疑解惑。
//ac代码#include <iostream>using namespace std;int main() {int N;long long n,s,e,v;cin>>N;while(N--) {cin>>n>>s>>e>>v;double joo=e-s,t;joo/=v;int f=1;for(int i=0;i<n;i++){cin>>s>>v;t=e-s;if(v==0)continue;t/=v;if(t<joo){f=0;} }if(f==1)cout<<"winner winner chicken dinner!!"<<endl;else cout<<"haojie help me!!"<<endl;}}
(ac代码的用时和内存)
76ms/2121KB(自己的代码的用时和内存)
如果觉得《T31901 狂热粉丝》对你有帮助,请点赞、收藏,并留下你的观点哦!