1. 程式人生 > 其它 >全國大學生演算法設計與程式設計挑戰賽 (秋季賽)——正式賽 | D: 蘭德索爾杯-cup

全國大學生演算法設計與程式設計挑戰賽 (秋季賽)——正式賽 | D: 蘭德索爾杯-cup

蘭德索爾杯-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;
}