小Q面前的桌子上有N个硬币,0表示正面,1 表示反面,现在他有一次机会可以选择一个ai~bi的段,把这个段的硬币都翻转一面,他现在想知道N个硬币中最多可以有多少个硬币正面朝上。
第一行一个整数N表示桌子上有N个硬币。 第二行为N个0和1,表示硬币i的状态。其中0表示正面, 1表示反面。
第一行有一个整数,表示翻转后最多有多少个硬币正面朝上。
4
1 0 1 1
3
7
0 1 1 0 1 1 0
6
【数据范围】
30的数据 1<=N<=100
60的数据 1<=N<=104
100的数据1<=N<=106
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int n,a[1000003],b[1000003],l,r=1,sum,ans;
int main(){
std::ios::sync_with_stdio(0);
cin>>n;l=n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==0)a[i]=1,sum++,ans++;
else a[i]=0;
b[i]=b[i-1]+a[i];
}
for(int i=n;i>0;i--)
if(a[i]==0){l=i;break;}
for(int i=1;i<=n;i++)
if(a[i]==0){r=i;break;}
for(int i=1;i<=l;i++)
{
int m=l-i+1,x=b[l]-b[i-1],y=m-x;//x:正面,y:反面
ans=max(ans,sum-x+y);
}
for(int i=n;i>=r;i--)
{
int m=i-r+1,x=b[i]-b[r-1],y=m-x;
ans=max(ans,sum-x+y);
//cout<<x<<" "<<y<<endl;
}
cout<<ans;
return 0;
}
不知道Where错了?试了几个数据都没错。