C. Binary String
题意: 给出t串字符串,对每一个字符串。 使其max(删去的1,剩下的0)等于代价(删去一个1的代价为1)
题解: 可以使用前缀和数组记录0、1的个数。 【二分答案】:枚举起始点,二分查找符合题意的终点,算出本次最小价值。最后求所有最小中的最小。 另外分享一个大佬的解法:转到知乎——思维解法
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define sc scanf
#define pr printf
const int maxn=2e5+7;
#define ll long long
const int mod=1e9+7;
int a[maxn];
int s0[maxn],s1[maxn];
int main() {
int t;cin>>t;
while(t--){
int mmin=INT_MAX;
string s;
cin>>s;
int n=s.size()+1;
s=" "+s;
for(int i=1;i<=n;i++){
if(i==1){
s0[i]=(s[i]=='0');
s1[i]=(s[i]=='1');
}
else {
s0[i]=s0[i-1]+(s[i]=='0');
s1[i]=s1[i-1]+(s[i]=='1');
}
}
for(int i=1;i<=n;i++){
int l=i-1,r=n;
ll ans=-1;
while(l<r){
int mid=(l+r+1)/2;
if(s0[mid]-s0[i-1]<s1[n]-s1[mid]+s1[i-1]){
l=mid;
}
else{
ans=mid;
r=mid-1;
}
}
int res=max(s0[ans]-s0[i-1],s1[n-1]-s1[ans]+s1[i-1]);
mmin=min(mmin,res);
}
mmin=min(mmin,s1[n]);
cout<<mmin<<endl;
}
return 0;
}
|