BNUZ-ACM 2019国庆新生欢乐赛 E.如风般奔跑(题目详解+代码)

原题链接:BNUZ-ACM 2019 E.如风般奔跑

BNUZ-ACM 2019国庆新生欢乐赛 E.如风般奔跑

题目

BNUZ-ACM 2019国庆新生欢乐赛 E.如风般奔跑(题目详解+代码)_第1张图片BNUZ-ACM 2019国庆新生欢乐赛 E.如风般奔跑(题目详解+代码)_第2张图片在这里插入图片描述

题目大意

这题题目的大意是:给你一个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

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
#include
 
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协会能越办越好

你可能感兴趣的:(C,ACM总结,BNUZ,BNUZ,2019国庆欢乐赛,如风般奔跑)