给出一个字符串S (∣ S ∣ < = 1 e 5 ),串中只有’0’,‘1’,'2’三种字符,计算不相交的子序列"2020"的最大数量是多少。
贪心在于遇到的2优先给2020中第一个2,遇到的0优先给2020中第一个0(前提有2),二分答案。我把这题想复杂了。
简单题,签个到吧。
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int maxn=1e5+7;
int n;
string s;
bool check(int x){
int a1=x,a2=0,a3=0,a4=0;
for(int i=0;i<n;i ++){
if(s[i]=='2'){
if(a1) a1--,a2++;
else if(a3) a3--,a4++;
}
else if(s[i]=='0'){
if(a2) a2--,a3++;
else if(a4) a4--;
}
}
if(a1||a2||a3||a4) return 0;
return 1;
}
int main(){
while(cin>>n){
cin>>s;
int l=0,r=n/4;
while(l<r){
int mid=l+r>>1;
if(check(mid)) l=mid+1;
else r=mid;
}
if(!check(l)) l--;
printf("%d\n",l);
}
}
/*
4
2222
7
2101210
8
22002200
0
1
2
*/