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;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号