每日一道算法题day-one(备战蓝桥杯)

从今天开始博主会每天做一道算法题备战蓝桥杯,并分享博主做题的思路,有兴趣就加入我把!

算法题目:

有一个长度为 N  的字符串 S ,其中的每个字符要么是 B,要么是 E

我们规定 S  的价值等于其中包含的子串 BB 以及子串 EE 的数量之和。

例如,BBBEEE 中包含 22 个 BB 以及 22 个 EE,所以 BBBEEE 的价值等于 44。

我们想要计算 S  的价值,不幸的是,在我们得到 S 之前,约翰将其中的一些字符改为了 F

目前,我们只能看到改动后的字符串 S对于其中的每个 F,我们并不清楚它之前是 B 还是 E

请你计算,改动前的 S 有多少种可能的价值并将所有可能价值全部输出。

输入格式

第一行包含一个整数 N。

第二行包含改动后的字符串 S。

输出格式

第一行输出一个整数 K,表示改动前的 S 的可能价值的数量。

接下来 K 行,按照升序顺序,每行输出一个可能价值。

输入样例1:

4
BEEF

输出样例1:

2
1
2

输入样例2:

9
FEBFEBFEB

输出样例2:

2
2
3

输入样例3:

10
BFFFFFEBFE

输出样例3:

3
2
4
6

 思路:

我们看字符串的F和E太过于麻烦,我们给抽象成01字符串,更清晰的看出关系

现在有这样一段字符串:
xx01xxx0010xxx011xx110

这段字符串中,有四段x组成的子字符串,而这四段子字符串,都是相互独立的,修改其中任意一端,都不会影响到其他三段的数值,所以我们可以把这四段各自对应的情况拿出来单独讨论,最后再合并到一起,就能求出答案:

步骤:

第一步,先分析每一段连续的x的价值有哪些。
第二步,再分析所有段的价值之和有哪些
k为x的数量
情况1:xxxxx 
长度为五的x,最多有四个相邻对,所以最大值是4,最小值自然是0  取值:0,1,2,……,k-1
情况2:(0xxxxx/1xxxxx)/(xxxxx0/xxxxx1) 
当我们x全取取相邻相同的数时,最大值就是k,最小值是0
取值:0,1,2,……,k
情况3:0xxxxxx0/1xxxxxx1 
最多就是都取成一样的 :k+1个 最少 :0个
但是我们中间画五个x最少是0个,但是如果中间是偶数呢,大家自己模拟一下,最少就会有一个,所以情况三就要分情况
最多: k+1

最少:       k+1是偶数:0 
       k+1是奇数:1
大家自己画图模拟一下很明了
现在要最大和最小都有了,自然要考虑中间的数能不能取到,每当我们改变一个数,就会改变两个数对的值,所以可以取值的数就是公差为2的等差数列
所以取值:k+1,k-1,k-3,……,0/1(取决于k的奇偶性)
第四种情况: 0xxxxx1/1xxxxx0  最多k个,和左边或者右边相同,
最小依旧是分情况讨论:
            k是偶数: 0个
            k是奇数: 1个
都是画图,通俗易懂
取值:每改变一个x,影响周围的两数对,所以取值依旧是公差为2的等差数列
k,k-2,k-4,……,1/0(取决k的奇偶性)

现在我们把每一种情况和段落都分析完了,可以进行合并了

问题1:如果我们合并两个公差为2的等差数列,会得到什么样的结果:
答案:会得到一个新的公差为2的等差数列,最小值是两个数列的最小值相加,最大值是两个数列的最大值相加
问题二:如果我们合并一个公差为2的等差数列和一个公差为1的等差数列,会得到什么样的结果?
答案,会得到一个公差为一的等差数列,最小值最大值同上


最终做法:
第一步:先求中间段。
第二步:再求两边的段
第三步:合并第一步和第二步的结果

 

 题解代码:

#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;
}

这是完全根据题解写的代码,其实其中一种思路,大家可以参考一下,也可以自己按照思路写代码,如果看不懂的话可以在评论区指出或者私信博主

对大家有帮助的话不要吝啬手里的点赞关注呀,以后每天博主都会带来优质内容。

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

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

相关文章

Spark---RDD介绍

文章目录 1.Spark核心编程2.RDD介绍2.1.RDD基本原理2.2 RDD特点1.弹性2.分布式 &#xff1a;数据存储在大数据集群的不同节点上3.数据集 &#xff1a;RDD封装了计算逻辑&#xff0c;并不保存数据4.数据抽象 &#xff1a;RDD是一个抽象类&#xff0c;具体实现由子类来实现5. 不可…

使用jieba库进行中文分词和去除停用词

jieba.lcut jieba.lcut()和jieba.lcut_for_search()是jieba库中的两个分词函数&#xff0c;它们的功能和参数略有不同。 jieba.lcut()方法接受三个参数&#xff1a;需要分词的字符串&#xff0c;是否使用全模式&#xff08;默认为False&#xff09;以及是否使用HMM模型&…

Python----matplotlib库

目录 plt库的字体&#xff1a; plt的操作绘图函数&#xff1a; plt.figure(figsizeNone, facecolorNone): plt.subplot(nrows, ncols, plot_number)&#xff1a; plt.axes(rect)&#xff1a; plt.subplots_adjust(): plt的读取和显示相关函数&#xff1a; plt库的基础图…

c++语言基础17-判断集合成员

题目描述 请你编写一个程序&#xff0c;判断给定的整数 n 是否存在于给定的集合中。 输入描述 有多组测试数据&#xff0c;第一行有一个整数 k&#xff0c;代表有 k 组测试数据。 每组数据第一行首先是一个正整数 m&#xff0c;表示集合中元素的数量&#xff08;1 < m &…

Java学习,一文掌握Java之SpringBoot框架学习文集(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

【Qt第三方库】QXlsx库——对 Excel 文件进行相关操作

0 前言 关键词&#xff1a;Qt&#xff1b;Excel&#xff1b;QXlsx&#xff1b;QInt 简介&#xff1a; QXlsx 是第三方开源的库&#xff0c;能够对 Excel 文件进行相关操作&#xff08;读写等&#xff09; 地址&#xff1a; QXlsx官网 QXlsx的Github主页 1 快速上手 对于第一次…

机器学习期末复习

机器学习 选择题名词解释&#xff1a;简答题计算题一、线性回归二、决策树三、贝叶斯 选择题 机器学习利用经验 &#xff0c;须对以下&#xff08;&#xff09;进行分析 A 天气 B 数据 C 生活 D 语言 归纳偏好值指机器学习算法在学习的过程中&#xff0c;对以下&#xff08;&a…

【第一期】操作系统期末大揭秘:知识回顾与重点整理

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 操作系统概述1.1 操作系统定义1.2 操作系统的作用1.3 操作系统的功能1.4 操作…

软考网络工程师教程第五版(2018最新版)

软考网络工程师教程第五版(2018最新版) 内容简介 本书是全国计算机技术与软件专业技术资格(水平)考试指定用书。作者在前4版的基础上,根据网络工程师新版大纲的要求,针对考试的重点内容做了较大篇幅的修订,书中主要内容包括数据通信、广域通信网、局域网、城域网、因特网…

【论文精读】A Survey on Large Language Model based Autonomous Agents

A Survey on Large Language Model based Autonomous Agents 前言Abstract1 Introduction2 LLM-based Autonomous Agent Construction2.1 Agent Architecture Design2.1.1 Profiling Module2.1.2 Memory ModuleMemory StructuresMemory FormatsMemory Operations 2.1.3 Plannin…

C++面向对象高级编程(侯捷)笔记2

侯捷C面向对象高级编程 本文是学习笔记&#xff0c;仅供个人学习使用&#xff0c;如有侵权&#xff0c;请联系删除。 如果你对C面向对象的组合、继承和委托不了解&#xff0c;对什么是拷贝构造、什么是拷贝赋值和析构不清楚&#xff0c;对类设计中的Adapter、pImpl、Template…

书生-浦路大模型全链路开源体系

2023年&#xff0c;大模型成为热门关键词 论文链接 大模型已经成为发展通用人工智能的重要途经 模型评测过程&#xff1a;从模型到应用 全链条开源开发体系 | 数据&#xff1a; 多模态融合 万卷包含文本、图像和视频等多模态数据&#xff0c;涵盖科技、文学、媒体、教育和法…