总所周知,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!!”
本题实际上就是一个很普通的追及问题,只需要算出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(自己的代码的用时和内存)