您是一個神仙,但您很喜歡采藥。
您有一個神奇的背包,背包內有VV個格子。
您所在的空間內有一些藥,每個藥會佔用11或22個格子。
每天可以進行一次如下操作:
採摘一個藥材放入背包中,若此時背包中沒有多餘的格子來放入新的藥材,可以先將背包中的若干藥材扔出去,至於扔多少以及扔幾個,全都由您决定。當然您也可以選擇不去進行採摘操作。
每一天結束前,神奇背包中的每個藥材都會產生一個藥丸。
作為神仙,您知道每天您可以採摘的藥材類型(即佔用格子數目),注意,當天的藥材如果不採摘,在第二天就會消失(當天藥材僅限當天採摘)。
為了獲得盡可能多的藥丸,請您計算最終能獲得的藥丸數目最多是多少?
#include <iostream>
#include <cstring>
using namespace std;
long long ans, cnt1, cnt2, V, n;
char s[100010];
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
{
//s[i] = 1;
if(cnt1 + 2 * cnt2 + 1 <= V) cnt1++;
else if(cnt2>0) cnt2 --, cnt1++;
}
ans += cnt2+cnt1;
}
cout << ans << endl;
return 0;
}
public static void main(String[] args) {
int num =1 ;
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String s = scanner.nextLine();
int dayNum = 0;
int totalNum = 0;
int[] a = new int[s.length()];
int number = 0;//背包现有药材占的份额
for(int i = 1 ;i < s.length();i++) {
int value = s.charAt(i) -48;
int c = number + value;
if (c <= n) {
number += value;
a[i] = value;
dayNum++;
totalNum += dayNum;
}
if (c > n && value == 1) {
boolean flag = true;
for (int j = 0; j < a.length; j++) {
if (a[j] == 2) {
a[j] = 1;
number = number-1;
flag = false;
totalNum += dayNum;
break;
}
}
if(flag)
totalNum += dayNum;
}
if(value == 2 &&c > n){
totalNum += dayNum;
}
}
System.out.println(totalNum);
}