郑陶缘
(郑陶缘)
1
题目描述
给定一个长度为 n 的 01 字符串。你需要从前面删去若干个字符(可以为 0 个),再从后面删去若干个字符(可以为 0 个),使得以下两者较大的一个尽可能小:
- 删去的 1 的个数。
- 留下的 0 的个数。注意你可以删空整个串。
输入格式
第一行一个整数 T,表示数据组数,
每组数据一行一个 01 字符串。
输出格式
每组数据输出一行,代表代价的最小值。
样例输入
5
101110110
1001001001001
0000111111
00000
1111
样例输出
1
3
0
0
0
数据规模
1≤T≤1041≤T≤104,1≤∣s∣≤2×1051≤∣s∣≤2×105,∑∣s∣≤2×105∑∣s∣≤2×105。
1 个赞
周子寓
(zzy10124)
5
这么说吧:二分综合
二分它的代价
思路:
先用两个数组统计所有01个数(前缀和)
然后二分代价:
while(...){
int mid=...
(check(mid,len)?r=mid:l=mid)
}
check里:
是个双指针,先找两个区间内的0个数,如果个数一直小于等于当前的价值,左指针就往左找
然后再看1~左指针
和右指针~n
的1个数是否合法,合法就return true,如果一直不合法就return false
1 个赞
周子寓
(zzy10124)
6
#include<bits/stdc++.h>
using namespace std;
int k;
char xx[200001];
int s[200001];
int ss[200001];
bool f(int m,int n){
for(...){
while(...){
y--;
}
if(...){
return true;
}
}
return false;
}
int main(){
...
}
1 个赞