兰德索尔杯-cup
Description
半年一度的兰德索尔杯开幕了!
「兰德索尔杯」是一个趣味跑步比赛。参加比赛的成员四人一组,在不同的赛道上进行跑步。下图就是跑步的一个场景:

可以看到,跑道上充满了一些特殊物件:加速阵、障碍物、魔物等等。这使得比赛充满了乐趣(你看她们玩的多开心啊)
在这道题目中,为了简化起见,我们可以认为每个人的跑步速度相同(其实本来就如此),且将跑道看作是一个长度为 nn 的字符串。字符串上的每个位置代表了 1\mathrm{m}1m 的距离。不同的字符分别代表不同的地形:
'.':代表平地,正常情况下,在平地上跑步速度 1\mathrm{m}/\mathrm{s}1m/s'w':代表水坑。正常情况下,在水坑上跑步速度为 0.5\mathrm{m}/\mathrm{s}0.5m/s 。'>':代表加速阵。所有人触碰到加速阵的瞬间,接下来 5s5s 内跑步速度翻倍,之后这个格子变为平地。注意,加速倍数和加速时间不能叠加。举例来说,如果当前加速时间剩余 3\mathrm{s}3s ,此时又碰到一个加速阵,加速时间重新变为 5\mathrm{s}5s。's':代表石块。所有人触碰到石块的瞬间都会被绊倒,在原地停留 1\mathrm{s}1s ,之后这个格子变为平地。'm':代表魔物。所有人触碰到魔物的瞬间需要在原地停留 2\mathrm{s}2s 打败魔物,之后这个格子变为平地。
现在,给出跑道的长度和每个跑道的地形,请输出每个人完成比赛的用时。
Input
第一行一个整数 nn 表示跑道长度。
接下来 44 行,每行一个长度为 nn 的字符串 s_isi ,分别表示 1,2,3,41,2,3,4 号选手的跑道。跑道信息如题目描述所述。
Output
输出一行 44 个小数(保留一位),分别为 1, 2, 3, 41,2,3,4 号选手完成比赛的时间。
Sample Input 1
10 >.wwws..s. .>.wwws.s. >>>>>s.m.m >w.wss..s.
Sample Output 1
11.0 11.0 11.0 11.5
Hint
1 \leq n \leq 1001≤n≤100
代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define mid (l+r>>1)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int>pii;
typedef vector<int>vi;
struct tri {int a, b, c;};
const int N = 1e5 + 10;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
int n;
double solve()
{
string s;
cin>>s;
double ret=0,ac=0;
for(auto &i:s)
{
if(i=='s')
{
ret+=1;
ac=max(0.0,ac-1);
i='.';
}
if(i=='m')
{
ret+=2;
ac=max(0.0,ac-2);
i='.';
}
if(i=='>')
{
ret+=0.5;
ac=4.5;
}
if(i=='.')
{
if(ac>=0.5)
{
ret+=0.5;
ac-=0.5;
}
else
{
ret+=1-ac;
ac=0;
}
}
if(i=='w')
{
if(ac>=1)
{
ret+=1;
ac-=1;
}
else
{
ret+=2-ac;
ac=0;
}
}
// cout<<i<<' '<<ret<<endl;
}
return ret;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
// freopen("in.txt", "r", stdin);
int n;cin>>n;
for(int i=0;i<4;i++)
{
cout<<fixed<<setprecision(1)<<solve()<<' ';
}
return 0;
}

这篇博客介绍了兰德索尔杯趣味跑步比赛的规则,包括不同地形对跑步速度的影响,如水坑、加速阵、石块和魔物等。文章通过简化模型,探讨了如何计算每个选手完成比赛的时间,并提供了一个C++代码示例来解决这个问题。博主通过实例解析了算法思路,帮助读者理解比赛策略和时间计算的细节。

被折叠的 条评论
为什么被折叠?



