原题
题目大意
题目背景是有一串数字,只包含1和0,你可以进行一次操作,即选一个区间,然后把这段区间里的1变成0,0变成1.题目要求在你完成一次操作后1的个数最大,并输出1的个数.
题目分析
首先看到这道题, 第一想法是找出这个最优区间,但是会发现这个最优区间很难找,再看看题目给出的数据大小,数字个数n最多只有100,便可暴力解决,即翻转每一个子区间,同时更新1个数的最大值.
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 const int INF=0x3f3f3f3f; 12 using namespace std; 13 14 int main() 15 { 16 int a[100]; 17 int ans=0,n; 18 cin>>n; 19 for(int i=0;i<n;i++) 20 { 21 cin>>a[i]; 22 if(a[i]==1) ans++; //在输入数据时顺便统计初始数据1的个数 23 } 24 int max=0,temp=ans; //max用来记录所有方案1的个数的最大值,temp用来记录每个方案的1的个数 25 for(int i=0;i<n;i++) 26 { 27 for(int j=i;j<n;j++) 28 { 29 if(a[j]==1) temp--; 30 else temp++; 31 if(max<temp) max=temp; 32 } 33 temp=ans; 34 } 35 36 cout<<max<<endl; 37 38 return 0; 39 }