分割01串/最大子段和——cf 1370E

这题转化一下,就是弄出个01串,然后问最少可以分割成多少个01串

怎么求?贪心策略,如果当前全是0结尾串,又来了一个0,那么只能又多了一个0结尾串,如果来的是1,那么就少了个0结尾串,多了个1结尾串

看了下正解貌似是求最大子段和。。

#include<bits/stdc++.h>
using namespace std;
#define N 4000005
 
int n,p,ans;
char a[N],b[N],s[N];
 
void solve(){
    int tot1=0,tot0=0;
    for(int i=1;i<=p;i++){
        if(s[i]=='0'){
            if(tot1)tot1--,tot0++;
            else tot0++;
        }else {
            if(tot0)tot1++,tot0--;
            else tot1++;
        }
        ans=max(ans,tot1+tot0);
    }
}
 
int main(){
    cin>>n;
    cin>>(a+1)>>(b+1);
    int x,y;
    x=y=0;
    for(int i=1;i<=n;i++){
        if(a[i]=='1')x++;
        if(b[i]=='1')y++;
    }
    if(x!=y){puts("-1");return 0;}
    
    for(int i=1;i<=n;i++)
        if(a[i]!=b[i])s[++p]=a[i];
    solve();
    
    cout<<ans<<'\n';
} 

 

posted on 2020-07-03 22:18  zsben  阅读(193)  评论(0编辑  收藏  举报

导航