算法刷题day11

目录

  • 引言
  • 一、FEB
  • 二、区间合并
  • 三、管道
  • 四、填充

引言

今天是初四,已经休息三天了,今天开始继续学习,然后觉得确实玩久了不太适应,已经有惰性了,不过还好自己喜欢,还是慢慢的坚持了下来,本来今天要看理论课的,也没看成,玩手机没停下来,不过好在做了些题,慢慢来吧。


一、FEB

标签:数学

思路:自己只能想出个暴力过了一半的数据,然后标准答案见示例代码2

题目描述:

有一个长度为 N 的字符串 S,其中的每个字符要么是 B,要么是 E。我们规定 S 的价值等于其中包含的子串 BB 以及子串 EE 的数量之和。例如,BBBEEE 中包含 2 个 BB 以及 2 个 EE,所以 BBBEEE 的价值等于 4。我们想要计算 S 的价值,不幸的是,在我们得到 S 之前,约翰将其中的一些字符改为了 F。目前,我们只能看到改动后的字符串 S,对于其中的每个 F,我们并不清楚它之前是 B 还是 E。请你计算,改动前的 S 有多少种可能的价值并将所有可能价值全部输出。输入格式
第一行包含一个整数 N。第二行包含改动后的字符串 S。输出格式
第一行输出一个整数 K,表示改动前的 S 的可能价值的数量。接下来 K 行,按照升序顺序,每行输出一个可能价值。数据范围
1≤N≤2×105
输入样例1:
4
BEEF
输出样例1:
2
1
2
输入样例2:
9
FEBFEBFEB
输出样例2:
2
2
3
输入样例3:
10
BFFFFFEBFE
输出样例3:
3
2
4
6

示例代码1:DFS

#include <cstdio>
#include <string>
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>using namespace std;string str;
unordered_map<int,int> map;
vector<int> res;int get()
{int res = 0;for(int i = 1; i < str.size(); ++i){if(str[i] == str[i-1]){res++;}}return res;
}void dfs(int u)
{if(u == str.size()){//cout << str << endl;int t = get();if(!map.count(t)){map[t]++;res.push_back(t);}return;}if(str[u] != 'F'){dfs(u+1);return;}str[u] = 'B';dfs(u+1);str[u] = 'E';dfs(u+1);str[u] = 'F';  // 这里一定要加上不然后面遍历后,再从前面开始这块就不是'F'了
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int n;cin >> n;cin >> str;dfs(0);sort(res.begin(), res.end());cout << res.size() << endl;for(int x: res){cout << x << endl;}return 0;
}

示例代码2:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;int n;
string s;int main()
{cin >> n >> s;if(s == string(n, 'F')){cout << n << endl;for(int i = 0; i < n; ++i)cout << i << endl;}else{int l = 0, r = n - 1;while(s[l] == 'F') l++;while(s[r] == 'F') r--;int low = 0, high = 0;auto str = s;for(int i = l; i <= r; ++i){if(str[i] == 'F'){if(str[i-1] == 'B') str[i] = 'E';else str[i] = 'B';}if(i > l && str[i] == str[i-1]) low++;}str = s;for(int i = l; i <= r; ++i){if(str[i] == 'F') str[i] = str[i-1];if(i > l && str[i] == str[i-1]) high++;}int ends = l + n - 1 - r, d = 2;if(ends) high += ends, d = 1;cout << (high - low) / d + 1 << endl;for(int i = low; i <= high; i += d)cout << i << endl;}return 0;
}

二、区间合并

标签:区间合并

思路:模板题没什么说的,马上就用了,熟悉一下

题目描述:

给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。输入格式
第一行包含整数 n。接下来 n 行,每行包含两个整数 l 和 r。输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。数据范围
1≤n≤100000,−109≤li≤ri≤109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3

示例代码:

#include <cstdio>
#include <iostream>
#include <algorithm>using namespace std;const int N = 1e5+10;struct Len
{int l, r;bool operator<(const Len& other){return l < other.l;}
}len[N];
int n;int main()
{scanf("%d", &n);for(int i = 0; i < n; ++i){scanf("%d%d", &len[i].l, &len[i].r);}sort(len, len+n);int res = 0;int l = -2e9, r = -2e9;for(int i = 0; i < n; ++i){if(len[i].l > r){res++;l = len[i].l;r = len[i].r;}else{r = max(r, len[i].r);}}cout << res << endl;return 0;
}

三、管道

标签:二分、区间合并

思路:就是给一条长为 m m m 的管子,每个管子中间有一个阀门和水流检测器,给出特定阀门打开的编号和时间,算能够使得所有监视器都检测到水的最短时间。明显这时间越长肯定能通过,所以单调性用二分,然后就是check条件了,假设最短时间为 m i d mid mid ,则会有多个区间代表水能够流通的管道编号,要做的就是把这些区间找出来,然后合并,看是否能够合并成从 [ 1 , m ] [1,m] [1,m] 的一个区间

题目描述:

有一根长度为 len 的横向的管道,该管道按照单位长度分为 len 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。一开始管道是空的,位于 Li 的阀门会在 Si 时刻打开,并不断让水流入管道。对于位于 Li 的阀门,它流入的水在 Ti(Ti≥Si)时刻会使得从第 Li−(Ti−Si) 段到第 Li+(Ti−Si) 段的传感器检测到水流。求管道中每一段中间的传感器都检测到有水流的最早时间。输入格式
输入的第一行包含两个整数 n,len,用一个空格分隔,分别表示会打开的阀门数和管道长度。接下来 n 行每行包含两个整数 Li,Si,用一个空格分隔,表示位于第 Li 段管道中央的阀门会在 Si 时刻打开。输出格式
输出一行包含一个整数表示答案。数据范围
对于 30% 的评测用例,n≤200,Si,len≤3000;对于 70% 的评测用例,n≤5000,Si,len≤105;
对于所有评测用例,1≤n≤105,1≤Si,len≤109,1≤Li≤len,Li−1<Li。输入样例:
3 10
1 1
6 5
10 2
输出样例:
5

示例代码:

#include <cstdio>
#include <iostream>
#include <algorithm>using namespace std;const int N = 1e5+10;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondint n, m;
PII w[N], q[N];bool check(int mid)
{int cnt = 0;for(int i = 0; i < n; ++i){int L = w[i].x, S = w[i].y;if(mid >= S){int t = mid - S;int l = max(1, L - t), r = min((LL)m, (LL)L + t);q[cnt++] = {l,r};}}sort(q, q+cnt);int l = -1, r = -1;for(int i = 0; i < cnt; ++i){if(q[i].x > r + 1) l = q[i].x, r = q[i].y;else r = max(r, q[i].y);}return l == 1 && r == m;
}int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < n; ++i) scanf("%d%d", &w[i].x, &w[i].y);int l = 0, r = 2e9;while(l < r){int mid = (LL)l + r >> 1;if(check(mid)) r = mid;else l = mid + 1;}printf("%d\n", r);return 0;
}

四、填充

标签:贪心

思路:这个跟FEB区别在于没有重叠,所以可以用贪心的方式

题目描述:

有一个长度为 n 的 01 串,其中有一些位置标记为 ?,这些位置上可以任意填充 0 或者 1,请问如何填充这些位置使得这个 01 串中
出现互不重叠的 00 和 11 子串最多,输出子串个数。输入格式
输入一行包含一个字符串。输出格式
输出一行包含一个整数表示答案。数据范围
对于所有评测用例,1≤n≤106。输入样例:
1110?0
输出样例:
2
样例解释
如果在问号处填 0,则最多出现一个 00 和一个 11:111000。

示例代码:

#include <cstdio>
#include <iostream>using namespace std;const int N = 1e6+10;string str;int main()
{ios::sync_with_stdio(false); cin.tie(0);cin >> str;int res = 0;for(int i = 1; i < str.size(); ++i){if(str[i] == str[i-1] || str[i] == '?' || str[i-1] == '?'){i++;res++;}}printf("%d\n", res);return 0;
}

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

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

相关文章

.NET高级面试指南专题七【SocketWebSocket】

Socket&#xff08;套接字&#xff09;是一种在计算机网络中实现通信的一种机制&#xff0c;它提供了一种标准的接口&#xff0c;使不同计算机上的程序能够通过网络进行数据交换。Socket允许在网络中的不同设备之间建立连接&#xff0c;进行双向的数据传输。 Socket通常用于实现…

Ubuntu如何使用宝塔面板部署开源论坛HadSky并结合内网穿透远程访问?

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

设计模式-策略模式 Strategy

策略模式 1) 原理和实现1、策略的定义2、策略的创建3、策略的使用 该模式最常见的应用场景是&#xff0c;利用它来避免冗长的 if-else 或 switch 分支判断。不过&#xff0c;它的作用还不止如此。它也可以像模板模式那样&#xff0c;提供框架的扩展点等等。 1) 原理和实现 策…

Linux基础命令1

Linux基础命令1 持续更新 ‍ 命令参数和作用示例ls列出文件和文件夹当前 ls​指定 ls /home​递归 ls -R​单列 ls -1​逗号分隔 ls -m​显示隐藏 ls -a​显示类型 ls -F​显示权限、所有者等详细信息 ls -l​按字母反序排列 ls -r​按扩展名排序 ls -lX​按日期和时间排序 …

php数组与字符串函数

php数组与字符串函数 1. php数组2. 字符串函数 1. php数组 在php中&#xff0c;有三种类型的数组&#xff1a; 数值数组 - 带有数字ID键的数组关联数组 - 带有指定的键的数组&#xff0c;每个键关联一个值多维数组 - 包含一个或多个数组的数组 2. 字符串函数 在PHP中&#xf…

耳机壳UV树脂制作私模定制耳塞适合什么样的人使用呢?

耳机壳UV树脂制作私模定制耳塞适合以下人群使用&#xff1a; 对音质要求高的人&#xff1a;私模定制耳塞能够完美契合用户的耳朵形状&#xff0c;减少漏音和外部噪音的干扰&#xff0c;提供更好的音质体验。需要长时间佩戴耳机的人&#xff1a;私模定制耳塞能够提高佩戴舒适度…

<网络安全>《30 常用安全标准》

《常用安全标准》 1 个人信息安全 o《信息安全技术 个人信息安全规范》&#xff08;GB/T35273-2017) o《信息安全技术 个人信息去标识化指南》&#xff08;GB/T37964-2019) 2 工业控制安全 o《信息安全技术 工业控制系统安全检查指南》&#xff08;GB/T 37980-2019) o《信息…

C++ //练习 6.41 下面的哪个调用是非法的?为什么?哪个调用虽然合法但显然与程序员的初衷不符?为什么?

C Primer&#xff08;第5版&#xff09; 练习 6.41 练习 6.41 下面的哪个调用是非法的&#xff1f;为什么&#xff1f;哪个调用虽然合法但显然与程序员的初衷不符&#xff1f;为什么&#xff1f; char *init(int ht, int wd 80, char bckgrnd ); (a) init(); (b) init(24…

Git基础命令,分支,标签的使用【快速入门Git】

Git基础命令&#xff0c;分支&#xff0c;标签的使用【快速入门Git】 Git基础常用命令Git工作流程工作区&#xff0c;暂存区和版本库文件状态获取Git仓库 git init | git clone查看文件状态 git status暂存已修改的文件 git add 查看已暂存和未暂存的修改 git diff提交文件更改…

【JAVA】类加载机制

目录 一、快速梳理JAVA类加载机制 1、JDK8的类加载体系 2、沙箱保护机制 3、Linking链接过程 二、一个用类加载机制加薪的故事 三、通过类加载器引入外部Jar包 四、自定义类加载器实现Class代码混淆 五、自定义类加载器实现热加载 六、打破双亲委派&#xff0c;实现同类…

VBA技术资料MF118:在多个工作表中插入页眉和页脚

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

多模态论文串讲·下【论文精读·49】最近使用 transformer encoder 和 decoder 的一些方法

大家好&#xff0c;我们今天就接着上次多模态串讲&#xff0c;来说一说最近使用 transformer encoder 和 decoder 的一些方法。 1 BLIP&#xff1a;Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 我们要过的第一篇论文…

计算机网络——11EMail

EMail 电子邮件&#xff08;EMail&#xff09; 3个主要组成部分 用户代理邮件服务器简单邮件传输协议&#xff1a;SMTP 用户代理 又名“邮件阅读器”撰写、编辑和阅读邮件输入和输出邮件保存在服务器上 邮件服务器 邮箱中管理和维护发送给用户的邮件输出报文队列保持待发…

LeetCode、435. 无重叠区间【中等,贪心 区间问题】

文章目录 前言LeetCode、435. 无重叠区间【中等&#xff0c;贪心 区间问题】题目链接及分类思路贪心、区间问题 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技…

08:K8S资源对象管理|服务与负载均衡|Ingress

K8S资源对象管理&#xff5c;服务与负载均衡&#xff5c;Ingress DaemonSet控制器污点策略容忍容忍污点 其他资源对象Job资源对象 有限生命周期CronJob资源对象 集群服务服务自动发现headless服务 实现服务定位与查找 服务类型 Ingress插件 发布服务的方式 DaemonSet控制器 Da…

【BFS拓扑排序】207. 课程表

207. 课程表 解题思路 首先构建了一个 inDegree 哈希表&#xff0c;用于存储每门课程的入度&#xff0c;即有多少课程依赖当前课程。 构建了一个 adj 哈希表&#xff0c;用于存储每门课程所依赖的其他课程。这个结构可以理解为一个邻接表&#xff0c;对于每门课程&#xff0c…

Elasticsearch:适用于 iOS 和 Android 本机应用程序的 Elastic APM

作者&#xff1a;来自 Elastic Akhilesh Pokhariyal, Cesar Munoz, Bryce Buchanan 适用于本机应用程序的 Elastic APM 提供传出 HTTP 请求和视图加载的自动检测&#xff0c;捕获自定义事件、错误和崩溃&#xff0c;并包括用于数据分析和故障排除目的的预构建仪表板。 适用于 …

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示 1 纹理 规则和不规则的 2 纹理的用处 从纹理中恢复形状 3 分割与合成 4 分析纹理进行分类 通过识别纹理分析物理性质 如何区分纹理 5 寻找有效的纹理分类方法 发现模式、描述区域内模式 A对应图2 B对应图…

Java 基于微信小程序的电子商城购物系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

从零开始学howtoheap:理解fastbins的​large_bin攻击

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指…