BNUZ-ACM 2019国庆新生欢乐赛 E.如风般奔跑
题目
题目大意
这题题目的大意是:给你一个800米的环形跑道以及小陈和小张的速度,问你什么时候他们能在200米处相遇
题解
这题十分简单,题目中最重要的关键句就是时间只能以秒递进。根据数学计算可知,小陈与小张若要在200米处相遇,那么他们相遇的时间必在800秒以内,因为800秒之后他们两个人将会回到跑道的原点,相当于重新开始,所以问题就转化成了:在800秒内,有没有可能小张与小陈相遇。
首先,时间只能以秒递进,我们就从1-800 for循环一遍,寻找是否有解就好了。
然后,题目中有提到他需要跑完那圈再退出比赛,也就是剩下的路程600处以小陈的速度就好了,不过时间以秒递进,所以如果有小数位的需要向上取整
样例解释
样例1:
秒(s) | 1s | 2s | 3s | … | 114s | 115s | … | 600s |
---|---|---|---|---|---|---|---|---|
小陈 | 3m | 6m | 9m | … | 342m | 345m | … | 200m |
小张 | 7m | 14m | 21m | … | 798m | 5m | … | 200m |
600s + (( 800m - 200m ) / 3(m/s) ) = 600s + 200s = 800s
代码(c)
#include<stdio.h>
int main(){
int T;
while(scanf("%d",&T)!=EOF){
for(int o=0;o<T;o++){
int n,m;
scanf("%d %d",&n,&m);
int a,b;
printf("Case #%d:\n",o+1);
int ans=1;//用于记录是否有输出
for(int ii=1;ii<=800;ii++){//时间1-800
a=n*ii%800;//计算位置
b=m*ii%800;
if(a==b&&a==200){//判断条件,相遇且在200米处
ans=0;
int mod = 0;//用于计算是否需要多跑一秒
if(600%n!=0)
mod++;
printf("%d\n",ii+600/n+mod);
break;
}
}
if(ans)
printf("我太难了\n");
}
}
return 0;
}
代码(c++)
#include<stdio.h>
#include<math.h>
int main(){
int T;
while(scanf("%d",&T)!=EOF){
for(int o=0;o<T;o++){
int n,m;
scanf("%d %d",&n,&m);
int a,b;
printf("Case #%d:\n",o+1);
int ans=1;//用于记录是否有输出
for(int ii=1;ii<=800;ii++){//时间1-800
a=n*ii%800;//计算位置
b=m*ii%800;
if(a==b&&a==200){//判断条件,相遇且在200米处
ans=0;
printf("%d\n",int(ceil(ii+600.0/n)));//ceil是向上取整函数,可以用其他方法实现
break;
}
}
if(ans)
printf("我太难了\n");
}
}
return 0;
}
给新生的话
怎么没人写啊啊啊啊啊,这么简单,这题不卡时间,没有特判,思路对了就能过了,不会向上取整+0.9999转int也可以呀,或者mod不等于0自增就好了
在思考可能有人看不懂样例,所以po了一下样例解析
本来思考了一下会不会有点简单,可以把跑道和喝水点也改成输入值 (那样就会很快乐) ,后来想了想还是弄道签到题吧,结果前两天都没多少人写T_T
那么,很感谢那些写了或者看过这题的朋友,也感谢来参与比赛的你们,希望ACM协会能越办越好