题目描述:
一个背包体积为V,给出一个字符串s,设长度为n。
则s[i]表示第i天的物品体积,为1或2。
第i天可以选择是否将物品i放入背包,若背包容量不够可以先
从中拿出若干物品。
每天结束前在背包中的每个物品会产生一个药丸。
问n天结束后,最多有多少药丸。
样例
对于第四组样例
第一天装入了体积为2的药,该天生产药丸数为1。
第二天装入了体积为1的药,该天生产药丸数为2。
第三天取出了体积为2的药,装入了体积为1的药,该天生产药丸数为2。
第四天未操作,生产药丸数为2。
第五天装入体积为1的药,该天生产药丸数为3
故 1+2+2+2+3=10 个
声明
- ans结果(最大)
- cnt1:体积为1的数量
- cnt2:体积为2的数量
- v:背包的体积
- n:字符串的长度
- char s[101111]:字符串
main
- cin>>v>>s;
- n=strlen(s)
- 遍历字符串
- 如果s[i]==‘2’能放就放(因为是字符串,所以’2’)
- 如果s[i]=='1’还是能放就放,放不下(也就是满了)看看里面有没有体积为2的药材,如果有cnt2–,cnt1++,因为这样可以腾出一个体积
- 一天产的药丸
- 最后输出
代码
#include <iostream>
using namespace std;
long long ans,cnt1,cnt2,v,n;
char s[101111];
int main()
{
cin>>v>>s;
n=strlen(s);
for(int i=0;i<n;i++){
if(s[i]=='2'){
if(cnt1+2*cnt2+2<=v)cnt2++;
}else{
if(cnt1+2*cnt2+1<=v)cnt1++;
else if(cnt2>0)cnt1++,cnt2--;
}
ans+=cnt1+cnt2;
}
cout <<ans<< endl;
return 0;
}