欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-12 20:52:48
...

问题描述:

半年一度的兰德索尔杯开幕了!
兰德索尔杯是一个趣味跑步比赛。参加比赛的成员四人一组,在不同的赛道上进行跑步。下图就是跑步的一个场景:
第二届全国大学生算法设计与编程挑战赛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;
}