1. 程式人生 > 實用技巧 >模擬賽2020.9.11

模擬賽2020.9.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;
}