【问题描述】
对于一个包含 n 个整数元素的序列a1、a2、...、an,每个元素的值或者是0或者是1,选择两个下标i和j(1≤i≤j≤n),对于所有的此范围内的元素ak(i≤k≤j),执行操作ak =1- ak。
选择合适的i和j,执行上述操作一次之后,可以得到的新序列中包含1的个数最多是多少?
【输入形式】
输入的第一行为一个整数 n(1≤ n ≤100),接来的一行为 n 个整数,每个整数或者是0或者是1。
【输出形式】
输出为一个整数,表示执行一次上述操作后可以获得的最大1的个数。
样例输入1】
5 1 0 0 1 0【样例输出1】
4【样例输入2】
4 1 0 0 1【样例输出2】
4【样例说明】
在第一个样例中,选择i=2, j=5, 改变后的序列为[1 1 1 0 1],包含4个1,很显然无法改变为[1 1 1 1 1]。
在第二个样例中,选择i=2, j=3,改变后的序列为[1 1 1 1],包含4个1。
【评分标准】
来源:327A
样例代码如下:
#include<iostream>
using namespace std;
int main(){
int n,count=0,max=0;
cin>>n;
int a[n],b[n];
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
}
//选择i,j的范围有n*(n-1)/2,每一种都要考虑,最终选出最多的
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
count=0;
for(int q=0;q<n;q++)
b[q]=a[q];
for(int m=i;m<=j;m++){//执行操作
b[m]=1-b[m];
}
//执行操作完后用count记录1的个数
for(int k=0;k<n;k++)
if(b[k]==1)
count++;
//判断count中的最大值
if(max<count)
max=count;
}
}
cout<<max;
}