当前位置:   article > 正文

第二届全国大学生算法设计与编程挑战赛D题:兰德索尔杯-cup_第二届全国大学生算法设计与编程挑战赛-d-兰德索尔杯-cup

第二届全国大学生算法设计与编程挑战赛-d-兰德索尔杯-cup

问题描述:

半年一度的兰德索尔杯开幕了!
兰德索尔杯是一个趣味跑步比赛。参加比赛的成员四人一组,在不同的赛道上进行跑步。下图就是跑步的一个场景:
在这里插入图片描述
可以看到,跑道上充满了一些特殊物件:加速阵、障碍物、魔物等等。这使得比赛充满了乐趣(你看她们玩的多开心啊)。
在这道题目中,为了简化起见,我们可以认为每个人的跑步速度相同(其实本来就如此),且将跑道看作是一个长度为 n 的字符串。字符串上的每个位置代表了 1m 的距离。
不同的字符分别代表不同的地形:

  • · ‘.’:代表平地,正常情况下,在平地上跑步速度 1m/s
  • · ‘w’:代表水坑。正常情况下,在水坑上跑步速度为 0.5m/s 。
  • · ‘>’:代表加速阵。所有人触碰到加速阵的瞬间,接下来 5s 内跑步速度翻倍,之后这个格子变为平地。注意,加速倍数和加速时间不能叠加。举例来说,如果当前加速时间剩余3s ,此时又碰到一个加速阵,加速时间重新变为 5s。
  • · ‘s’:代表石块。所有人触碰到石块的瞬间都会被绊倒,在原地停留 1s ,之后这个格子变为平地。
  • · ‘m’:代表魔物。所有人触碰到魔物的瞬间需要在原地停留 2s 打败魔物,之后这个格子变为平地。

输入格式:

第一行一个整数 n 表示跑道长度。接下来 4 行,每行一个长度为 n 的字符串 ,分别表示 1,2,3,4 号选手的跑道。跑道信息如题目描述所述。

输出格式:

输出一行 4 个小数(保留一位),分别为 1, 2, 3, 4 号选手完成比赛的时间。

样例输入:

10
>.wwws…s.
.>.wwws.s.
>>>>>s.m.m
>w.wss…s.

样例输出:

11.0 11.0 11.0 11.5

思路分析:

这道题的难点在于理解题目,我刚开始做的时候理解老半天。题意大概是这样:刚开始人的速度是1m/s,这点很重要。然后难点在于要设置一个用于放置当前还剩多少加速时间的变量buff,最后还有一点就是buff一定是0.5的整数倍,这让我们省去了很多计算量。
详细的思路写在了代码注释里,简单易懂!!!!

AC代码:

#include<bits/stdc++.h>
using namespace std;

string s[4];

int main() {
	int n;
	cin >> n;
	double res = 0.0;
	for(int i = 0; i < 4; i++) {
		cin >> s[i];
	}
	for(int i = 0; i < 4; i++) {
		double buff = 0;               //刚开始加速时间剩余时间为0 
		res = 0;                       //res用于保存跑步过程中的累计时间 
		for(int j = 0; j < n; j++) {
			switch(s[i][j]) {
				case '.':
					if(buff >= 0.5) {   //平地情况下加速后速度为2m/s,通过1m的距离需要0.5s
						res += 0.5;     //判断当前剩余加速时间是否多于0.5s,多于的话就以2m/s 
						buff -= 0.5;    //的速度跑步,res加上0.5,buff相应减少0.5 
					}else {
						res += 1;       //这里不需要再判断是否属于0-0.5之间某个数,因为buff只能为 
					}                   //0.5的整数倍,不大于0.5,那就是0,按照平地上1m/s速度跑步 
					break;
				case 'w':
					if(buff >= 1) {     //水坑情况下加速后速度为1m/s,通过1m的距离需要1s
						res += 1;       //判断当前剩余加速时间是否多于1s,多于的话就以1m/s
						buff -= 1;      //的速度跑步,res加上1,buff相应减少1
					}else if(buff == 0.5){  //这里就需要考虑0.5秒的情况了,buff等于0.5时可以以 
						res += 1.5;         //1m/s的速度跑0.5s,再以0.5m/s的速度跑1s,共1.5s 
						buff = 0;
					}else {
						res += 2;       //否则就以0.5m/s的速度跑2s 
					}
					break;
				case '>':              //遇到加速阵,buff重新变成5 
				    buff = 5;
					buff -= 0.5;       //之后这个格子变为平地,加速耗费0.5秒 
					res += 0.5;
					break;
				case 's':              
					res += 1;          //碰到石块绊倒,首先停留1s 
					if(buff >= 1) {    //注意你停留的时候buff也要相应减少1s 
						buff -= 1;
					}else {
						buff = 0;
					}
					if(buff != 0) {    //之后格子变为空地,判断是否还有0.5s的加速时间,同上 
						res += 0.5;
						buff -= 0.5;
					}else {
						res += 1;
					}
					break;
				case 'm':
					res += 2;          //触碰魔物的瞬间停留2s打败魔物 
					if(buff > 2) {     //buff相应减少2s 
						buff -= 2;
					}else {
						buff = 0;
					}
					if(buff != 0) {    //之后变为平地,判断是否还有0.5秒的加速时间 
						res += 0.5;
						buff -= 0.5;
					}else {
						res += 1;
					}
					break;
			}
		}
		printf("%.1f ", res);
	}
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/76126
推荐阅读
相关标签
  

闽ICP备14008679号