思维+贪心——cf1042D

/*
首先考虑从后往前计算lis,显然0的在很多情况下的贡献要大于1 
如果遇上0,那么lis++,如果遇上1,那么cnt1++,并且用cnt1更新lis
这样的贪心保证正确,因为从[i,j]这一段的lis必定是前一段0,后一段1这样的构成,当前面多了个0时,显然lis+1
当前面多了个1时当且仅当区间1的个数大于lis,才能让lis+1,
因此当且仅当后缀[i,n]中1的个数大于lis时,对于所有区间[i,j],这个1的作用才等价于1,可以替换
*/
#include<bits/stdc++.h>
using namespace std;
#define N 200005
char s[N],t[N];
int main(){
    int n;cin>>s;
    n=strlen(s);
    int lis=0,cnt1=0;
    for(int i=n-1;i>=0;i--){
        if(s[i]=='0')lis++;
        else cnt1++;
        if(cnt1>lis){
            t[i]='0';
            lis=cnt1;
        }
        else t[i]=s[i];
    }
    cout<<t;
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/11512984.html
今日推荐