1 条题解

  • 0
    @ 2025-8-24 22:12:57

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar hwx12233
    这个人废了,什么都没留下

    搬运于2025-08-24 22:12:57,当前版本为作者最后更新于2019-11-13 20:12:58,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    嗯,这道题有点水。。

    就是求一个最大子段和

    解法

    显然我们可以求前缀和,然后求解,但是有点慢?吧

    这里介绍一种新的

    又显然 我们可以:

    遇到00当前最优解就+1+1,并与全局最优解取maxmax

    遇到11当前最优解1-1,并与00minmin(因为如果小于00,那么不如不选这前面的所有

    设一个ans1ans1记录部分最优解,ans2ans2记录到全局的最优解ans2(ans2记得初始值为1-1,防止所有都是1的情况

    最后奉上代码,码风炸裂,大佬勿喷。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline int max(int x,int y){return x>y?x:y;}
    #define int ll
    int n;char s[100501];
    signed main()
    {
    	cin>>s;int ans1=0,ans2=-1;
    	n=strlen(s);
    	for(int i=0;i<n;i++){
    		int tmp=s[i]-'0';
    		if(tmp==0){
    			ans1++;
    			ans2=max(ans1,ans2);
    		}
    		else 
    			ans1=max(0,ans1-1);
    	}
    	cout<<ans2;
    }
    

    谢谢观看!

    • 1

    信息

    ID
    4636
    时间
    1000ms
    内存
    500MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者