【CSU-2181】解题报告(枚举分界点)

强化题目和线性做法在这里 【CSU-2187】解题报告(维护顺序极差)

原始题目

2181: 翻转游戏

  • Time Limit: 1 Sec
  • Memory Limit: 128 Mb
  • Submitted: 115
  • Solved: 34

Description

给当一个01串,最多可以对一段区间里的01取反一次,求最多能取得的1的个数

Input

多组数据,第一行为数组组数\(T(T ≤ 10)\)

每组数据第一行一个整数 \(N(1 ≤ N ≤ 100)\)

第二行一个长度为\(N\)的01字符串

Output

每组数据输出一行代表答案

Sample Input

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);
}

// rep(i,1,n+1){ cout<<"#"<<a[i]<<" "<<b[i]<<endl;}
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;

// cout<<"left="<<le[i]<<" right="<<ri[j]<<endl;
int temp1=a[ri[j]]-a[le[i]-1];
int temp0=b[ri[j]]-b[le[i]-1];
// cout<<temp1<<" "<<temp0<<endl;
ans=max(all-temp1+temp0,ans);
// cout<<"tempans="<<ans<<endl;
}

}
cout<<ans<<endl;

}
}

收获与反思

合理枚举