因为要求成功的游戏都放在后面,所以从后往前数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; }