每日一道算法题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.mfbz.cn/a/290672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++模板(泛型)

1. 模板 1.1 知识点 模板&#xff1a;template 泛型编程&#xff1a; 是指数据的类型是广泛&#xff0c;任意的数据类型 模板&#xff1a;可以将一个函数或类描述成一个模板&#xff0c;例如&#xff1a;画画&#xff0c;给一个人物模型上色彩&#xff0c;根据用户上的色彩是什…

Bean如何诞生与消亡:生命周期探秘【beans 二】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Bean如何诞生与消亡&#xff1a;生命周期探秘【beans 二】 前言bean的创建过程bean的初始化阶段1. 实现InitializingBean接口&#xff1a;2. 使用PostConstruct注解&#xff1a; bean的属性注入1. Set…

视频倒放软件,看视频如何演绎“逆袭”之旅

你是否厌倦了日复一日的平淡生活&#xff0c;渴望时光倒流&#xff0c;重温那些逝去的精彩瞬间&#xff1f;在数字技术的世界里&#xff0c;这样的愿望或许不再遥不可及。视频倒放仿佛让时光倒流&#xff0c;给我们的视觉带来了全新的冲击&#xff0c;今天&#xff0c;让我们一…

新手第一次在linux上用git上传代码到仓库全过程

目录 背景&#xff1a; 过程&#xff1a; -1.去github.com自己的账号先建个仓库repository 0.命令行输入 git version 看下有无安装git 1.git init 初始化了一个Git仓库&#xff0c;你可以 ls -a 看见这个隐藏的目录 3.git add . 添加要上传的文件到Git的暂存区&#xff0…

windows对微信及小程序抓包:Burp+Fiddler+Proxifier

本文由掌控安全学院 - zbs 投稿 话不多说&#xff0c;直接先上个效果图&#xff1a; 新新的版本哈&#xff1b; 好好的抓包哈&#xff1b; 然后直接说我如何配置的&#xff1a; 准备好三个工具&#xff1a;bp、fiddler、proxifier【也可以用其他的进行代理】 bp、proxifie…

ELement UI时间控件el-date-picker误差8小时解决办法

一、问题描述&#xff1a; 在项目中引用了elementui中的date-picker组件&#xff0c;选中的时间跟实际相差八小时&#xff0c;且格式不是自己想要的格式 <el-date-pickertype"date"placeholder"选择日期"format"yyyy/M/d"v-model"form…

R304S 指纹识别模块的硬件接口说明

一.外部接口尺寸图 二.串行通讯 R304S 指纹模块通讯接口定义&#xff1a; 引脚号名称定义描述15V电源输入电源正输入端 DC 4.2--6V2GND电源和信号地电源和信号地3TXD数据发送串行数据输出&#xff0c;TTL 逻辑电平4RXD数据接收串行数据输入&#xff0c;TTL 逻辑电平 三.USB通…

EtherCAT的COE报文

本文主要用于记录工作中需要学习的内容&#xff0c;如有冒犯请私信&#xff01; COE协议 下面我们介绍以下CANOpen在EtherCAT中的应用。 COE的对象字典 COE协议是完全遵循CANopen协议的&#xff0c;但针对EtherCAT通信做了一些扩展&#xff0c;索引为0x1c00~0x1c4f&#xff0…

Java中关键词strictfp有什么作用?

在Java中&#xff0c;关键词strictfp用于声明一个方法、类或接口是严格遵守浮点数计算规范的。 具体作用包括&#xff1a; 保证浮点数计算的结果在不同平台上是一致的&#xff0c;避免由于浮点数计算的不精确性导致的结果不确定性。 指定了严格的浮点数计算规则&#xff0c;禁…

LeetCode刷题---矩阵置零

解题思路&#xff1a; 本题要求原地置换元素 对矩阵进行第一轮遍历&#xff0c;使用第一行第一列来充当该行该列是否要置换为0的标记位&#xff0c;如果第一行或第一列本身就含有零元素&#xff0c;我们使用colZero和rowZero变量来对其标记。如果第i行第j列的那个元素为0&#…

产品经理如何选择城市?

年底&#xff0c;全国性的人口大迁徙即将开始。选择城市&#xff0c;堪称年轻人的“二次投胎”&#xff0c;族望留原籍&#xff0c;家贫走他乡。 古人在选择城市时&#xff0c;主要的考量因素是家族势力&#xff0c;这一点放在当代&#xff0c;大致也成立&#xff0c;如果在老…

Cell 文章图复现

多组差异火山图复现 参考文章: A Spatiotemporal Organ-Wide Gene Expression and Cell Atlas of the Developing Human Heart Figure 2. H 图里主要是单细胞数据不同cluster之间的差异火山图, 所以说白了就是散点图和柱状图的结合, 散点图用差异基因绘制, 柱状图利用logFC最…

关于MIPS上手应知应会-如何把C语言改写为MIPS!

文章目录 寄存器指令使用技巧翻译C/Cif/else语句switch语句for循环while 循环do...while循环一维数组定义与使用二维数组定义与使用例 &#xff1a;哈密顿回路 注意立即数被符号位扩展 参考链接 寄存器 NameReg. NumUsage z e r o zero zero0constant value 0(恒为0) a t at a…

TypeScript Array(数组)

目录 1、数组初始化 2、Array 对象 3、数组迭代 4、数组在函数中的使用 4.1、作为参数传递给函数 4.2、作为函数的返回值 5、数组方法 数组对象是使用单独的变量名来存储一系列的值。数组非常常用。假如你有一组数据&#xff08;例如&#xff1a;网站名字&#xff09;…

Java中的IO与NIO篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、信号驱动 IO 模型二、异步 IO 模型三、JAVA NIO四、NIO 的缓冲区前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

P1423 小玉在游泳python

s float(input()) sum 0 step 0 meter 2.0 while sum < s:sum metermeter 0.98 * meterstep 1 print(step)

三、C语言中的分支与循环—switch语句(4)分支结构 完

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结构的…

linux创建pyspark虚拟环境

一、创建虚拟环境 conda create -n test python3.6.6 二、注意添加镜像 vi /root/.condarc channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/- http://mirrors.ustc.edu.cn/anaconda/pkgs/ma…

jmeter使用心得(一)

jmeter作为接口测试的常用工具之一&#xff0c;在我们的测试中经常会用到&#xff0c;往期的文章中&#xff0c;我们也分享过jmeter的各种功能和用法&#xff0c;基本覆盖了方方面面&#xff0c;可以满足各种接口测试的需求。但实际测试中我们也会发现&#xff0c;jmeter这么强…

测试管理-缺陷管理工具安装

前言&#xff1a; 项目生命周期里面&#xff0c;开发软件后&#xff0c;需要进行正规的测试&#xff0c;测试除了需要编写测试用例和写测试总结外&#xff0c;还需要进行bug的闭环控制&#xff0c;方便追踪。之前用过惠普的QC系统&#xff0c;这个是收费的&#xff0c;专业做缺…
最新文章