模擬賽2020.9.11
阿新 • • 發佈:2020-09-11
題目背景
bleaves最近在wzoi上面做題。
wzoi的題目有兩種,一種是noip題,一種是省選題。
bleaves的做題方式很特別。每一天,她可能會看一道題目,這時她會選擇題目種類,
然後wzoi會在選定種類中隨機扔給她一道她還沒看過的題,她會把這道題看一遍,
然後存在腦子裡慢慢思考;她也有可能寫題,
這時她一定會寫沒寫過的題中看的時間最遲的一題(如果不存在沒寫過的且沒看過的題,她就不能寫題)。
題目描述
wzoi每天會有一個推薦的題目種類,
如果bleaves看一道題目:如果種類和推薦的相同,那麼這道題目最大得分為10,否則為5
如果bleaves寫一道題目:如果種類和推薦的相同,那麼這道題目得分為最大得分,否則為最大得分-5
假如bleaves現在還沒看過任何一題,並且她知道了wzoi接下來一些天每天推薦的種類,問她在這些天的最大得分。
輸入格式
一行一個01串s,|s|表示天數,\(s_i=0\)
表示wzoi第i天推薦noip題,
\(s_i=1\)表示wzoi第i天推薦省選題。
輸出格式
一行一個整數最大得分。
輸入輸出樣例
輸入 #1複製
0011
輸出 #1複製
20
輸入 #2複製
0101
輸出 #2複製
10
輸入 #3複製
0110
輸出 #3複製
20
思路
如果 s 中有兩個連續的1或0,那麼可以讓他們匹配,然後刪去他們,遞迴處理。
最終剩下來的一定是1,0交錯,這時一定無法讓兩個相同種類匹配了,貢獻可以直接算。
#include<bits/stdc++.h> using namespace std; stack<char> s; const int maxn=1001000; string ch; long long ans; int main() { cin>>ch; int len=ch.length(); s.push(ch[0]); for(int i=1;i<=len-1;i++) { if(s.top()!=ch[i]) s.push(ch[i]); else { ans+=10; s.pop(); } } ans+=(s.size()/2)*5; cout<<ans<<endl; return 0; }