赞
踩
半年一度的兰德索尔杯开幕了!
兰德索尔杯是一个趣味跑步比赛。参加比赛的成员四人一组,在不同的赛道上进行跑步。下图就是跑步的一个场景:
可以看到,跑道上充满了一些特殊物件:加速阵、障碍物、魔物等等。这使得比赛充满了乐趣(你看她们玩的多开心啊)。
在这道题目中,为了简化起见,我们可以认为每个人的跑步速度相同(其实本来就如此),且将跑道看作是一个长度为 n 的字符串。字符串上的每个位置代表了 1m 的距离。
不同的字符分别代表不同的地形:
第一行一个整数 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的整数倍,这让我们省去了很多计算量。
详细的思路写在了代码注释里,简单易懂!!!!
#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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。