模拟赛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();
	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;
}
posted @ 2020-09-11 22:06  邦的轩辕  阅读(143)  评论(0编辑  收藏  举报