P4832

珈百璃堕落的开始

题目描述

这道题是这样的:给定一些sin(x)2,cos(x)2(x=pi/7)组成的式子,请你帮忙求出选择一些式子相加后得到的最大整数答案

输入格式

第一行一个整数n,表示n个式子

接下来n行每行一个字符串,由f(i)=sin(x)2,cos(x)2 和+组成(x=pi/7) ,为了简化输入,我们以s代表sin(x)^2 ,以c代表cos(x)^2 ,并省略f(i)=

输出格式

一个数表示最大整数答案,计算全部为加法

样例 #1

样例输入 #1

3
s+c
s+c+s
c

样例输出 #1

3

提示

样例解释:三个式子都选,则加起来等于3

设s和c的个数总和为m

10%的数据n=1

另有20%的数据每行一个单项式

另有20%的数据n≤20

100%的数据nm≤5*107,m≤106

很妙的一道背包问题
我们最终要是整数相当于最终cnts-cntc==0
所以我们的w=cnts-cntc v=cntc(cnts)
注意负数 所以我们取一个zero即可
注意有负数0-1背包不能降维 所以用滚动数组优化空间
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int f[2000005],g[2000005];
int n;int l,r;
const int zero=1000005;
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	memset(f,-0x3f,sizeof(f));memset(g,-0x3f,sizeof(g));
	
	g[zero]=0;
	for(int i=1;i<=n;i++)
	{
		string s;
		cin>>s;int len=s.size();
		int cnts=0,cntc=0;
		for(int j=0;j<len;j++)
		{
			if(s[j]=='s')cnts++;
			else if(s[j]=='c')cntc++;
		}
//		cout<<cnts<<" "<<cntc<<"\n";
		int w=cnts-cntc,v=cnts;
		l=min(l,l+w),r=max(r,r+w);
		for(int j=l+zero;j<=r+zero;j++)
			f[j]=max(f[j],max(g[j],g[j-w]+v));
		for(int j=l+zero;j<=r+zero;j++)
			g[j]=f[j];
	}
	cout<<f[zero]<<"\n";
	return 0;
}
posted @ 2023-01-28 20:06  PKU_IMCOMING  阅读(36)  评论(0)    收藏  举报