第二届全国大学生算法设计与编程挑战赛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;
}

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/109931312