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

6 篇文章 0 订阅
5 篇文章 0 订阅

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

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

题目

在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意

这题题目的大意是:给你一个800米的环形跑道以及小陈和小张的速度,问你什么时候他们能在200米处相遇

题解

这题十分简单,题目中最重要的关键句就是时间只能以秒递进。根据数学计算可知,小陈与小张若要在200米处相遇,那么他们相遇的时间必在800秒以内,因为800秒之后他们两个人将会回到跑道的原点,相当于重新开始,所以问题就转化成了:在800秒内,有没有可能小张与小陈相遇。

首先,时间只能以秒递进,我们就从1-800 for循环一遍,寻找是否有解就好了。
然后,题目中有提到他需要跑完那圈再退出比赛,也就是剩下的路程600处以小陈的速度就好了,不过时间以秒递进,所以如果有小数位的需要向上取整

样例解释

样例1:

秒(s)1s2s3s114s115s600s
小陈3m6m9m342m345m200m
小张7m14m21m798m5m200m

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值