因为要求成功的游戏都放在后面,所以从后往前数1的个数,b[i]表示位置i前有几个1,从前往后数0的个数,c[i]表示位置i后有几个0

一旦选择了一个1,后面的所有游戏都只能选1,不能留一个0,基于这样的规定,前面只能留0,因此依次比较b[i]+c[i]的值,取最大值即可(特别地,c[n+1]为0的总和,即所有1都去掉时的情况)

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;

ll n,m,k;
ll a[520520];
ll b[520520];
ll c[520520];

ll sum;

ll o,z;
ll minn=0;

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int ans=0;
    for(int i=n;i>=1;i--)
    {
        if(a[i]==1)ans++;
        b[i]=ans;
    }
    ans=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==0)ans++;
        c[i]=ans;
    }
    c[n+1]=ans;
    ans=0;

    for(int i=1;i<=n+1;i++)
    {
        if(i==n+1)
        {
            minn=max(c[i],minn);
            break;
         }
        if(a[i])
        {
            minn=max(b[i]+c[i],minn);
        }
    }
    cout<<minn;
    return 0;
}