长乐爆零之旅 day7 wzoi

版权声明:八月炊火的博客如需转载请注明出处 https://blog.csdn.net/qq_34990731/article/details/82956267

二话不说上题目:
题目描述:
bleaves最近在wzoi上面做题。 的题目有两种,一种是noip题,一种是省选题。 bleaves的做题方式很特别。每一天,她可能会看一道题目,这时她会选择题目种类,然后wzoi会在选定种类中随机扔给她一道她还没看过的题,她会把这道题看一遍,然后存在脑子里慢慢思考;她也有可能写题,这时她一定 会写没写过的题中看的时间最迟的一题(如果不存在没写过的且没看过的题,她就不能写题)。 wzoi每天会有一个推荐的题目种类, 如果bleaves看一道题目:如果种类和推荐的相同,那么这道题目最大得分为10,否则为5 如果bleaves写一道题目:如果种类和推荐的相同,那么这道题目得分为最大得分,否则为最大得分-5 假如bleaves现在还没看过任何一题,并且她知道了wzoi接下来一些天每天推荐的种类,问她在这些天的最大得分。
输入输出格式:
输入格式:
一行一个01串 ,|s|表示天数,si=0表示wzoi第i天推荐noip题,si=1表示wzoi第i天推荐省选题。
输出格式:
一行一个整数最大得分。
输入输出样例:
输入样例1:
0011
输出样例1 :
20
输入样例2:
0101
输出样例2:
10
输入样例3:
0110
输出样例3:
20
说明:
样例解释1 4天行动依次为:看一道noip题,写第1天看的题,看一道省选题,写第3天看的题。 全部的输入数据满足:1<=n<=1000000,n为偶数。
在这里插入图片描述

这一题吐血,原来这么简单,根据题目我们可以发现如果看题和做题都符合推荐的话的10分,否则都是5分,为什么没有0分呢,因为根据题目要求求最大值,然后根据每天看题写题都是自由的,所以我们可以证明不可能出现0分。然后我们就要考虑,因为看题和写题没有限制,所以我们可以根据贪心选择符合推荐的做,然后剩下的问题就是写题和看题的顺序了,根据贪心如果有两天推荐刚好相等那么我们就一天看一天写,那么转化一下就是左右括号匹配问题,我们设看题为左括号,写题为右括号,如果推荐相等即左右括号匹配,那么我们直接删除就好了。说人话就是先扫一遍,如果有匹配的括号则删除,并且记录有几对,最后这几对就是10分,剩下的则全5分,计算一下就好了。
上代码:

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<stack>//一波头文件 
using namespace std;
int a[1000100];
stack <int> q;
int main()
{
	memset(a,0x3f,sizeof(a));//为了避免全局数组0的影响清空一下,只要不是0和1都可以 
	long long ans=0;//存答案 
	int n,much=0;
	string s;
	getline(cin,s);//得到一行 
	n=s.length();
	for(int i=0;i<n;i++)//转化成人话 
		a[i+1]=s[i]-'0';
	for(int i=1;i<=n;i++)//扫一遍 
	{
		if(!q.empty() && a[i]==q.top())//如果有左括号且匹配 
		{
			q.pop();//匹配成功删除 
			much++;//统计一下 
		}
		else q.push(a[i]);//没有匹配则把这个看做左括号,入栈 
	}
	much=(n>>1)-much;//计算有多少对不是10分即5分 
	ans+=(n>>1)*10-much*5;//假设全10分再减去有多少对只得5分的差值 
	printf("%lld",ans);//输出一波 
	return 0;
}

马上就要走了,还有点舍不得呢。

猜你喜欢

转载自blog.csdn.net/qq_34990731/article/details/82956267