写的时候一直想贪,但是找不到贪的方向。
发现只要二分选多少个1,然后枚举一遍选的是那个连续的部分即可,可以水过。当时也是一直在想头和尾怎么搞。发现有单调性但是也没想到怎么二分,码力不够啊qaq。
不会时你永远可以相信二分
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
for (int i = 0; i < t; i++){
string s;
cin >> s;
int N = s.size();
vector<int> S(N + 1);
S[0] = 0;
for (int j = 0; j < N; j++){
S[j + 1] = S[j];
if (s[j] == '0'){
S[j + 1]++;
}
}
vector<int> one;
for (int j = 0; j < N; j++){
if (s[j] == '1'){
one.push_back(j);
}
}
int cnt = one.size();
int tv = cnt, fv = -1;
while (tv - fv > 1){
int mid = (tv + fv) / 2;
bool ok = false;
for (int j = 0; j <= mid; j++){
int L = one[j];
int R = one[cnt - 1 - mid + j] + 1;
if (S[R] - S[L] <= mid){
ok = true;
}
}
if (ok){
tv = mid;
} else {
fv = mid;
}
}
cout << tv << endl;
}
}