蓝桥杯23年第十四届省赛真题-填充|DFS,贪心

news2024/11/23 23:45:59

题目链接:

1.填充 - 蓝桥云课 (lanqiao.cn)

蓝桥杯2023年第十四届省赛真题-填充 - C语言网 (dotcpp.com)

说明: 

dfs就不再多说了,对于每个?都有0和1两个分支,数据范围是:

那么有m个 ?,时间复杂度就是 O(2^{m}),会超时。蓝桥杯官网可以过35%的数据,暴力先拿到一部分再说。

这里需要注意的是:对于?的字符的每层,最后要把它复原,恢复为?

DFS代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
string s;
int mx=0;
int len;

//参数含义:当前搜索层数k,搜索到第k个字符(从0开始),cn:前面是否有一个单个的字符可以出现00或11串  
//num当前找到的不重叠的00或11子串 数量 
void dfs(int k,int cn,int num){
	
	//剩下所有字符都可以组成合法子串加上当前数量都比已经找到的数量小,不再搜索 
	if(num+(len-k)/2<mx) return;
	
	//k个字符都已经搜索过,递归出口 
	if(k==len){
		if(num>mx){
			mx=num;
		}
		
		return;
	}
	
	if(s[k]!='?'){
		
		//同时满足 前面是否有一个单个的字符,两个字符相同才计数 ,单个字符数计为0 
		if(cn==1&&s[k]==s[k-1]){
	 		dfs(k+1,0,num+1);
		 }
		else{
		//不满足,不计数,该字符是一个单一的字符 
			dfs(k+1,1,num);
		}
	}
	
	else{
		s[k]='0';
		if(cn==1&&s[k]==s[k-1])
		dfs(k+1,0,num+1);
		else
		dfs(k+1,1,num);
		
		
		s[k]='1';
		if(cn==1&&s[k]==s[k-1])
		dfs(k+1,0,num+1);
		else
		dfs(k+1,1,num);
		
	    //退出前 要还原成'?' 
	    s[k]='?'; 
		
	 }
} 

signed main() {
 
   ios::sync_with_stdio(0);
   cin.tie(0);
   cout.tie(0);
    
   cin>>s;
   len=s.size();
   int cnt=0;
   
   
   for(int i=0;i<len;i++){
   	
   	if(s[i]!='?'){
   		
   		//i为0时特别处理,防止i-1越界 
   		if(i==0){
   			cnt=1;
		   }
		else{
		   	if(cnt==1&&s[i]==s[i-1]){
		   		cnt=0;
		   		mx++;
			   }
			else{
			   cnt=1;	
		    }
		   }
   		
	   }
	   
	int n=mx;
   	if(s[i]=='?'){
   		
   		//i为0时特别处理,防止i-1越界 
   	if(i==0) 
	{
		s[i]='0';
		dfs(i+1,1,n);
		s[i]='1';
		dfs(i+1,1,n);
	}
   		
   	else{
   		dfs(i,cnt,n);
	   }	
   		
		   
		break;
	}
	   
	   
	   
   }

  cout<<mx;
  return 0;
}


/*
测试数据
01?1001???101?1?0000?0110????0?001?110?0?00?01?1??

答案:22 

*/




贪心:当前能组成一个合法子串的时候我就组合起来,因为如果我放弃这个组合,我最多让后面一个字符和它后面的字符组成一个合法子串,而浪费了我当前这个字符,组合更多的合法子串就是尽量利用每一个可以利用的字符。
再观察可得: 
 '00、11、0?、1?、?1、?0、??'都是正确的,01,10 不行 。可以组成合法子串时,这两个字符已经成对不用再看了,跳过这两个字符,不能成对,看下个字符,因为下个字符可能和他的下个字符成对,我们需要 利用每一个可以利用的字符成对 。

贪心代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;

int len;
int mx=0;//最大值 

signed main() {
 
   ios::sync_with_stdio(0);
   cin.tie(0);
   cout.tie(0);
   string s;
   
   cin>>s;
   len=s.size();
   
   for(int i=0;i<len-1;){
   	//贪心,当前能组成一个合法子串的时候我就组合起来,因为如果我放弃这个组合
	//我最多让后面一个字符和它后面的字符组成一个合法子串,而浪费了我当前这个字符
	//组合更多的合法子串就是尽量利用每一个可以利用的字符
	//再观察可得: 
	//'00、11、0?、1?、?1、?0、??'都是正确的,01,10 不行 
	//可以组成合法子串时,这两个字符已经成对不用再看了,跳过这两个字符,不能成对,看下个字符,因为下个字符可能和他的下个字符成对
	//需要 利用每一个可以利用的字符成对 
	
	if(s[i]==s[i+1]||s[i]=='?'||s[i+1]=='?') {
		i+=2;
		mx++;
	}
   	else   i++;
   }

  cout<<mx;
  return 0;
}

 参考:蓝桥杯真题讲解:填充(贪心)-CSDN博客

的另一个版本 ,更好想更好梳理思路一些。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;

int len;
int mx=0;//最大值 
bool st[N];//标记是否被匹配过 
signed main() {
 
   ios::sync_with_stdio(0);
   cin.tie(0);
   cout.tie(0);
   string s;
   
   cin>>s;
   len=s.size();
   
//   for(int i=0;i<len-1;){
   	//贪心,当前能组成一个合法子串的时候我就组合起来,因为如果我放弃这个组合
	//我最多让后面一个字符和它后面的字符组成一个合法子串,而浪费了我当前这个字符
	//组合更多的合法子串就是尽量利用每一个可以利用的字符
	//再观察可得: 
	//'00、11、0?、1?、?1、?0、??'都是正确的,01,10 不行 
	//可以组成合法子串时,这两个字符已经成对不用再看了,跳过这两个字符,不能成对,看下个字符,因为下个字符可能和他的下个字符成对
	//需要 利用每一个可以利用的字符成对 
	
//	if(s[i]==s[i+1]||s[i]=='?'||s[i+1]=='?') {
//		i+=2;
//		mx++;
//	}
//   	else   i++;
//   }
  
  //另一种角度的贪心,每个字符优先跟前一个字符匹配,不能,再跟后面的字符匹配
   for(int i=0;i<len;i++){
   	
   	//因为是一个一个挪的 首先要判断 当前 字符是否已经匹配过 
   	if(s[i]!='?'&&!st[i]){
   	if(i-1>=0&&(s[i-1]==s[i])&&!st[i-1])
   	{
   		st[i]=true;
   		st[i-1]=true;
   		mx++;
	}
   	else if(i+1<len&&(s[i+1]==s[i]))
   	{
   		st[i]=true;
   		st[i+1]=true;
   		mx++;
	}
			
	}
   	
   	
   	//?可以匹配 任意落单的字符   
	else{
		if(st[i]) continue;
		
		if(i-1>=0&&!st[i-1])
   	{
   		s[i]=s[i-1]; 
   		st[i]=true;
   		st[i-1]=true;
   		mx++;
	}
   	else if(i+1<len)
   	{
   		s[i]=s[i+1]; 
   		st[i]=true;
   		st[i+1]=true;
   		mx++;
	}
		
		
	}
	
	
   }
   

  cout<<mx;
  return 0;
}


/*
测试数据
01?1001???101?1?0000?0110????0?001?110?0?00?01?1??

答案:22 

*/




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1553744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

️ 如何掌握服务器硬件基础知识:为高效运维打下坚实基础

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

GTC 2024 火线评论:DPU 重构文件存储访问

编者按&#xff1a;英伟达2024 GTC 大会上周在美国加州召开&#xff0c;星辰天合 CTO 王豪迈在大会现场参与了 GPU 与存储相关的最新技术讨论&#xff0c;继上一篇《GTC 2024 火线评论&#xff1a;GPU 的高效存储利用》之后&#xff0c;这是他发回的第二篇评论文章。 上一篇文章…

网络七层模型之表示层:理解网络通信的架构(六)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

服务器被挖矿了怎么办,实战清退

当我们发现服务器资源大量被占用的时候&#xff0c;疑似中招了怎么办 第一时间重启服务是不行的&#xff0c;这些挖矿木马一定是会伴随着你的重启而自动重启&#xff0c;一定时间内重新霸占你的服务器资源 第一步检查高占用进程 top -c ps -ef 要注意这里%CPU&#xff0c;如果…

企微这个工具太好用,提升企业销售业绩效果好!

在商海浮沉中&#xff0c;销售业绩的提升始终是企业的核心追求。想要把产品卖出去&#xff0c;首要任务便是吸引客户。如今&#xff0c;线上线下的销售模式已然成为主流&#xff0c;短视频社交媒体如抖音、快手等平台更是成为了流量争夺的热门战场。但面对这些平台上的海量且流…

自动发卡平台源码优化版,支持个人免签支付

源码下载地址&#xff1a;自动发卡平台源码优化版.zip 环境要求&#xff1a; php 8.0 v1.2.6◂ 1.修复店铺共享连接时异常问题 2024-03-13 23:54:20 v1.2.5 1.[新增]用户界面硬币增款扣款操作 2.[新增]前台对接库存信息显示 3.[新增]文件缓存工具类[FileCache] 4.[新增]库存同…

营销大师:小米汽车定价的道道!喝酒买车你沾了吗?——早读(逆天打工人爬取热门微信文章解读)

雷神之锤降临&#xff0c;睡不着的是车企&#xff0c;不应该是你 引言Python 代码第一篇 雷军&#xff1a;小米SU7 现已开启定购&#xff5c;人车合一&#xff0c;我心澎湃第二篇 人民日报 来啦新闻早班车要闻社会政策 结尾 “物有所值乃生存之基石&#xff0c;性价比则为选择之…

Ribbon简介

目录 一 、概念介绍 1、Ribbon是什么 2、认识负载均衡 2.1 服务器端的负载均衡 2.2 客户端的负载均衡 3、Ribbon工作原理 4、Ribbon的主要组件 IClientConfig ServerList ServerListFilter IRule Iping ILoadBalancer ServerListUpdater 5、Ribbon支持…

Vue生命周期,从听说到深入理解(全面分析)

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被称为生命周期钩子的函数&#xff0c;让开发者有机会在特定阶…

1.10 类、方法、封装、继承、多态、装饰器

一、介绍类 类(class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例 实例化&#xff1a;创建一个类的实例&#xff0c;类的具体对象。 对象&#xff1a;通过类定义的数据结构实例。对象包括两个数据成员&#x…

FebHost:意大利个人或企业都注册.IT域名吗?

对于广大意大利企业而言,拥有一个属于自己的”.IT”域名已经成为了一种标准做法。无论是中小型本土企业还是知名跨国公司,他们都纷纷选择这一突出意大利特色的国家顶级域名来彰显自身的品牌形象。 数据显示,截至2023年6月,在全球注册的350多万个”.IT”域名中,有超过220万个来…

python pytz是什么

pytz模块常用于时区的转换&#xff0c;常常配合datetime一起使用。我们知道datetime除了data方法生成的时间是没有时区概念&#xff0c;其他如time、datetime等都是有时区概念&#xff0c;即指定了tzinfo信息。 >>> import datetime >>> datetime.datetime.n…

FPGA工程师职业发展道路

作为FPGA工程师&#xff0c;你可以通过以下几个步骤来发展自己的职业道路&#xff1a; 1. 学习基础知识&#xff1a;首先&#xff0c;你需要学习数字电路设计和计算机体系结构的基础知识。了解FPGA的原理、架构和工作原理是非常重要的。 2. 掌握HDL编程语言&#xff1a;掌握至…

企微侧边栏开发(内部应用内嵌H5)

一、背景 公司的业务需要用企业微信和客户进行沟通&#xff0c;而客户的个人信息基本都存储在内部CRM系统中&#xff0c;对于销售来说需要一边看企微&#xff0c;一边去内部CRM系统查询&#xff0c;比较麻烦&#xff0c;希望能在企微增加一个侧边栏展示客户的详细信息&#xf…

有效的数独-java

题目描述: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#…

C++实现A*路径规划的库

作者&#xff1a;CodeLikeAGirl 编译&#xff1a;东岸因为一点人工一点智能公众号 C实现A*路径规划的库本文中&#xff0c;我们探索了A*路径规划在Robotic Project C中的迷人世界&#xff0c;了解了一些超酷的C库。https://mp.weixin.qq.com/s/WyTIzkmWS-0t5oaII6or-Q 01 A*…

ventoy_grub2_boot_win7_win10.md

ventoy (grub2) 的 extMenu启动 win7 efi 、win10 efi ventoy界面按F6&#xff08;extMenu菜单&#xff09; 弹出 ventoy/ventoy_grub.cfg中的菜单内容 ventoy (grub2) 的 extMenu启动 win7 efi 1. 生成 老式 分区启动记录 EFI\Microsoft\Boot\bootmgfw.efi: 命令: bcdboot…

知识图谱构建三要素:实体、关系与属性技术与实战全解析

目录 一、知识图谱三要素简介实体&#xff08;Entity&#xff09;的重要性关系&#xff08;Relationship&#xff09;的作用属性&#xff08;Attribute&#xff09;的应用 二、实体&#xff08;Entity&#xff09;理论介绍实体的概念细节实体的分类实体识别的技术细节实体识别的…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…

大咖论道 | RPA与AI在企业数字化转型中的角色与未来

前言&#xff1a;在ISIG-RPA峰会的圆桌论坛中&#xff0c;由中投创展创始人兼CEO任威主持了关于企业自动化转型的深入讨论&#xff0c;嘉宾包括UiPath大中华区资深技术经理王栊、SAP业务技术平台卓越中心方案架构师阎韶华和三井住友保险中国区信息技术部负责人陈婧。 讨论焦点…