3 条题解
-
2
贴个二分代码,跑得比spq的
O(N)
做法快
思路: 假设1的数量是。如果答案是,那么我们最多删除了个1,并且最多留下了个0。如果,一定满足要求。因此,答案存在单调性,我们考虑对区间使用二分。我们实现一个数组,其中是字符串中第个1的位置。在函数中,我们枚举每个删完后剩下的区间,并判断其中0的个数是否。
核心代码:signed main() { setIO(); string str; cin>>str; vector<int> pos; for(int i=0; i<str.size(); i++) if(str[i]=='1') pos.eb(i); if(pos.empty() || pos.back()-pos.front()==pos.size()-1) return cout<<0<<endl, 0; int l=0, r=pos.size(), res=r; auto check=[&](int mid) -> bool { int k=pos.size(), x=k-mid; for(int i=0; i<=mid; i++) { int l=pos[i], r=pos[i+x-1]; if(r-l+1-x<=mid) return true; } return false; }; while(l<=r) { int mid=(l+r)>>1; if(check(mid)) r=mid-1, res=mid; else l=mid+1; } cout<<res<<endl; return 0; }
信息
- ID
- 20
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 113
- 已通过
- 17
- 上传者