强化题目和线性做法在这里 【CSU-2187】解题报告(维护顺序极差)
原始题目
2181: 翻转游戏
- Time Limit: 1 Sec
- Memory Limit: 128 Mb
- Submitted: 115
- Solved: 34
Description
给当一个01串,最多可以对一段区间里的01取反一次,求最多能取得的1的个数
多组数据,第一行为数组组数\(T(T ≤ 10)\)
每组数据第一行一个整数 \(N(1 ≤ N ≤ 100)\)
第二行一个长度为\(N\)的01字符串
Output
每组数据输出一行代表答案
2
4
1001
4
1111
Sample Output
4
4
Hint
Source
Author
Wells
题目大意
如题
解题思路
枚举分界点,暴力更新最大值
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <cstdio> #include <cstring> #include <iostream> #include <string> #include <set> #include <queue> #include <vector> #include <bits/stdc++.h> using namespace std; const int maxn=1e5+5; const int maxm=1e5+5; #define rep(i,a,n) for(int i=a;i<n;++i) #define per(i,a,n) for(int i=n-1;i>=a;--i) #define fi first #define se second #define INF 0x3f3f3f3f #define EPS 1e-8 #define mp make_pair #define np next_permutation #define pb push_back
typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef pair<int,int> pii; typedef pair<string,string> pss;
int t,n; vi le,ri; int a[maxn]; int b[maxn]; int main(){ ios::sync_with_stdio(false); cin>>t;
while(t--){ cin>>n; string s; cin>>s; int len=s.length(); le.clear(); ri.clear(); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); rep(i,0,n){ if(s[i]=='1'){ a[i+1]=a[i]+1; b[i+1]=b[i]; } else { a[i+1]=a[i]; b[i+1]=b[i]+1; } if(s[i]=='0' && i==0 || s[i]=='0' && s[i-1]=='1') le.push_back(i+1); if(s[i]=='0' && i==n-1 || s[i]=='0' && s[i+1]=='1') ri.push_back(i+1); }
if(le.empty() && ri.empty()){ cout<<n<<endl; continue;
} int all=a[n]; int ans=-INF; for(int i=0;i<le.size();i++){ for(int j=0;j<ri.size();j++){ if(le[i]>ri[j]) continue;
int temp1=a[ri[j]]-a[le[i]-1]; int temp0=b[ri[j]]-b[le[i]-1];
ans=max(all-temp1+temp0,ans);
}
} cout<<ans<<endl;
} }
|
收获与反思
合理枚举