题目背景
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();
for(int i=1;i<=len-1;i++)
{
if(s.empty()||s.top()!=ch[i])
s.push(ch[i]);
else
{
ans+=10;
s.pop();
}
}
ans+=(s.size()/2)*5;
cout<<ans<<endl;
return 0;
}