2020 ICPC 2020(二分)

 

给出一个长度为 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;
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页