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

题目链接:

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);elsedfs(k+1,1,num);s[k]='1';if(cn==1&&s[k]==s[k-1])dfs(k+1,0,num+1);elsedfs(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.hqwc.cn/news/576417.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初阶:2_类与对象(下)

类与对象(下) 一.再谈构造函数 1. 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _ye…

38.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-解码器类的优化调试

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;37.解码器细化类…

“光学行业正被量子颠覆”——行业巨头齐聚,展示量子成果

OFC是全球最大的光网络和通信盛会&#xff0c;代表一系列产品&#xff0c;从光学元件和设备到系统、测试设备、软件和特种光纤&#xff0c;代表整个供应链&#xff0c;并提供业界学习、连接、建立网络和达成交易的首要市场&#xff0c;于2024年3月24日至28日在圣地亚哥会议中心…

excel中批量插入分页符

excel中批量插入分页符&#xff0c;实现按班级打印学生名单。 1、把学生按照学号、班级排序好。 2、选择班级一列&#xff0c;点击数据-分类汇总。汇总方式选择计数&#xff0c;最后三个全部勾选。汇总结果一定要显示在数据的下发&#xff0c;如果显示在上方&#xff0c;后期…

Science Robotics 逼真面部表情的机器人

人类可以产生数千种不同的面部表情来传达无数微妙的情绪状态&#xff0c;这种能力是人类社会互动中最有效和最有效的界面之一。在 2019 年冠状病毒病流行期间&#xff0c;口罩使社交互动变得尴尬&#xff0c;因为它们掩盖了面部表情。同时&#xff0c;当摄像机打开时&#xff0…

成都市酷客焕学新媒体科技有限公司:实现品牌的更大价值!

成都市酷客焕学新媒体科技有限公司专注于短视频营销&#xff0c;深知短视频在社交媒体中的巨大影响力。该公司巧妙地将品牌信息融入富有创意和趣味性的内容中&#xff0c;使观众在轻松愉悦的氛围中接受并传播这些信息。凭借独特的创意和精准的营销策略&#xff0c;成都市酷客焕…

火车头通过关键词采集文章的原理

随着互联网信息的爆炸式增长&#xff0c;网站管理员和内容创作者需要不断更新和发布新的文章&#xff0c;以吸引更多的用户和提升网站的排名。而火车头作为一款智能文章采集工具&#xff0c;在这一过程中发挥着重要作用。本文将探讨火车头如何通过关键词采集文章&#xff0c;以…

SAP BTP云上一个JVM与DB Connection纠缠的案例

前言 最近在CF (Cloud Foundry) 云平台上遇到一个比较经典的案例。因为牵扯到JVM &#xff08;app进程&#xff09;与数据库连接两大块&#xff0c;稍有不慎&#xff0c;很容易引起不快。 在云环境下&#xff0c;有时候相互扯皮的事蛮多。如果是DB的问题&#xff0c;就会找DB…

网络爬虫框架Scrapy的入门使用

Scrapy的入门使用 Scrapy概述引擎&#xff08;Engine&#xff09;调度器&#xff08;Scheduler&#xff09;下载器&#xff08;Downloader&#xff09;SpiderItem Pipeline 基本使用安装scrapy创建项目定义Item数据模型对象创建爬虫(Spider)管道pipeline来保存数据启动爬虫 其他…

cuda python课程中“使用 Numba 的 CUDA Python 的自定义核函数和内存管理“一个大坑

总觉得自己的算法没问题&#xff0c;最终还是测试结果不符。 错误出现在一个很顺眼的位置。 解决方案 在最终测验阶段有一个看起来没问题不需要任何修改的Cell&#xff0c;就是这一句&#xff0c;看起来没什么毛病 d_histogram_out cuda.device_array_like(histogram_out)需…

Java代码混淆技术在应用程序保护中的关键作用与应用

摘要 本文探讨了代码混淆在保护Java代码安全性和知识产权方面的重要意义。通过混淆技术&#xff0c;可以有效防止代码被反编译、逆向工程或恶意篡改&#xff0c;提高代码的安全性。常见的Java代码混淆工具如IPAGuard、Allatori、DashO、Zelix KlassMaster和yGuard等&#xff0…

【数据分析面试】3.编写数据选取函数(Python)

题目 给定了一个名为 students_df 的学生数据表格 nameagefavorite_colorgradeTim Voss19red91Nicole Johnson20yellow95Elsa Williams21green82John James20blue75Catherine Jones23green93 编写一个名为 grades_colors 的函数&#xff0c;以选择仅当学生喜欢的颜色是绿色或…