当前位置: 首页 > news >正文

【菜笔cf刷题日常-1600】C. Binary String(二分求min/max)

链接:https://codeforces.com/contest/1680/problem/C

题意:给一段01组成的字符串序列,要求从前面和从后面删去一段连续字符后,使以下两值的最大值:

  • 字符串中剩余的字符数 0;
  • 从字符串中删除的字符数 1

最小的答案

思路:使用二分。判断:已知答案大于等于 字符串中剩余的字符数 0从字符串中删除的字符数 1 ,先建立 pos 数组记录 1 的位置,用前缀和记录 0 ,每次枚举( 1 的总数 - 答案 )个连续 1 中间 0 的个数,如果小于等于答案,则成立

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,t,k,l,r,q,p,x,idx,res,cnt,sum,flag,maxx,minn;
const int N=200010;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f3f3f3f3f;
int a[N],b[N],c[N],d[N];
string s;
vector<int> pos;
bool check(int mid){
	if(mid==pos.size())return 1;
	flag=0;
	int tem=pos.size()-mid-1;
	for(int i=0;i<pos.size()-tem;i++){
		if(a[pos[i+tem]]-a[pos[i]]<=mid){
			flag=1;
			break;
		}
	}
	return flag;
}

void solve(){	
	cin>>s;
	s=" "+s;
	pos.clear();
	for(int i=1;s[i];i++){
		a[i]=a[i-1]+(s[i]=='0');
		if(s[i]=='1'){
			pos.push_back(i);
		}
	}
	
	
	l=0,r=pos.size();
	if(check(l)){
		cout<<l<<'\n';
		return;
	}
	while(l+1<r){
		int mid=(l+r)/2;
		if(check(mid)){
			r=mid;
		}
		else l=mid;
	}
	cout<<r<<'\n';


}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--)solve();
	return 0;
}


相关文章:

  • 厦门大学第二讲:DeepSeek大模型赋能高校教学和科研(124页)(文末附下载方法)
  • 辉视融合服务器方案:为小酒店行业铺垫未来智能化布局
  • 人工智能之数学基础:n阶行列式
  • C语言文件操作学习笔记:从基础到实践
  • Android U 分屏——SystemUI侧处理
  • 【算法系列】桶排序算法介绍及实现
  • [绘图机器]
  • 达梦数据库备份
  • vue2(笔记)4.0vueRouter.声明式/编程式导航以及跳转传参.重定向
  • LeetCode 2161. Partition Array According to Given Pivot(2025/3/3每日一题)
  • flink分布式事务 - 两阶段提交
  • 大模型微调
  • 从零到一:快速上手 Poetry——Python 项目管理的利器
  • 高频 SQL 50 题(基础版)_196. 删除重复的电子邮箱
  • 0304作业
  • 深入探索像ChatGPT这样的大语言模型-03-POST-Training:Reinforcement Learning
  • 《几何原本》命题I.9
  • Swagger详细使用介绍
  • Python第十三课:数据库交互 | 信息帝国的基石
  • 慕慕手记项目日记2025.3.3
  • 杭州全网推广/网站整站优化
  • wordpress主题样式/最优化方法
  • 2022百度seo最新规则/seo实战培训中心
  • 广东网站制作多少钱/淘宝搜索关键词排名查询工具
  • 做商城网站需要备案什么域名/手机怎么建网站
  • 商城小程序方案/seo网站推广主要目的不包括