全國大學生演算法設計與程式設計挑戰賽 (秋季賽)——正式賽 | D: 蘭德索爾杯-cup
阿新 • • 發佈:2020-12-31
蘭德索爾杯-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; }