给出一个长度为 n 的字符串,统计 {si,sj,su,sv}=2020 的数量,并且 i<j<u<v ,如果一个字符被统计过,那么它不能再次被统计
知道题目考察二分之后其实并没有那么难,二分枚举答案 ans,但是要考虑如何构成 2020 才能 ans 个,我们可以按位考虑,必须有第一个 2 后面的 0 才有效,有 ans 个 2 后,第二个 2 才开始计数
算法复杂度 O(nlogn)
const int N=1e5+5;
int i,j,k;
int n,m,t;
int a[N];
int C(int aim)
{
int bits[5]={0};
bits[1]=aim;
for(int i=1;i<=n;i++){
if(a[i]==1) continue;
if(a[i]==2) {
if(bits[1]) bits[1]--,bits[2]++;
else if(bits[3]) bits[3]--,bits[4]++;
}
if(a[i]==0){
if(bits[2]) bits[2]--,bits[3]++;
else if(bits[4]) bits[4]--;
}
}
if(bits[1] || bits[2] || bits[3] || bits[4]) return 0;
return 1;
}
int main()
{
//IOS;
while(~sd(n)){
for(int i=1;i<=n;i++) scanf("%1d",&a[i]);
int l=0,r=n/4+1,ans=0;
while(r>=l){
int mid=l+r>>1;
if(C(mid)) l=mid+1,ans=mid;
else r=mid-1;
}
pd(ans);
}
//PAUSE;
return 0;
}