求助
  • 板块学术版
  • 楼主Mx_sky
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/4/11 07:40
  • 上次更新2023/10/23 18:46:29
查看原帖
求助
713205
Mx_sky楼主2023/4/11 07:40

题目描述

小Q面前的桌子上有NN个硬币,00表示正面,11 表示反面,现在他有一次机会可以选择一个aia_i~bibi的段,把这个段的硬币都翻转一面,他现在想知道NN个硬币中最多可以有多少个硬币正面朝上。

输入

第一行一个整数NN表示桌子上有NN个硬币。 第二行为NN个00和11,表示硬币ii的状态。其中00表示正面, 11表示反面。

输出

第一行有一个整数,表示翻转后最多有多少个硬币正面朝上。

输入样例1

4
1 0 1 1

输出样例1

3

输入样例2

7
0 1 1 0 1 1 0

输出样例2

6

提示

【数据范围】

3030%的数据 1<=N<=1001<=N<=100

6060%的数据 1<=N<=1041<=N<=10^4

100100%的数据1<=N<=1061<=N<=10^6

我的代码:

#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错了?试了几个数据都没错。

2023/4/11 07:40
加载中...