全国大学生算法设计与编程挑战赛 (秋季赛)——正式赛 | D: 兰德索尔杯-cup

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

兰德索尔杯-cup

Description

 

半年一度的兰德索尔杯开幕了!

「兰德索尔杯」是一个趣味跑步比赛。参加比赛的成员四人一组,在不同的赛道上进行跑步。下图就是跑步的一个场景:

图片 1.png

可以看到,跑道上充满了一些特殊物件:加速阵、障碍物、魔物等等。这使得比赛充满了乐趣(你看她们玩的多开心啊)

在这道题目中,为了简化起见,我们可以认为每个人的跑步速度相同(其实本来就如此),且将跑道看作是一个长度为 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

12 26 25

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值