[蓝桥杯]交换次数
交换次数
题目描述
IT 产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称 BAT )在某海滩进行招聘活动。
招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:BABTATT,这使得应聘者十分别扭。
于是,管理部门要求招聘方进行必要的交换位置,使得每个集团的席位都挨在一起。即最后形如:BBAAATTT 这样的形状,当然,也可能是:AAABBTTT 等。
现在,假设每次只能交换 2 个席位,并且知道现在的席位分布,你的任务是计算:要使每个集团的招聘席位都挨在一起需要至少进行多少次交换动作。
输入描述
输入是一行 nn 个字符(只含有字母 B、A 或 T ),表示现在的席位分布。
输出描述
输出是一个整数,表示至少交换次数。
输入输出样例
示例
输入
TABTABBTTTT
输出
3
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 573 | 总提交次数: 720 | 通过率: 79.6%
难度: 中等 标签: 2018, 暴力, 国赛
方法思路
题目要求将字符串中的字母B、A、T分别分组,每组字母连续出现,计算最少交换次数。交换操作每次可以交换任意两个位置的字符。核心思路是枚举所有可能的分组顺序(共6种:BAT、BTA、ABT、ATB、TBA、TAB),对每种顺序计算将原字符串调整为该顺序所需的最小交换次数,然后取所有顺序中的最小值。
解决步骤
-
枚举分组顺序:遍历6种可能的分组顺序(BAT、BTA、ABT、ATB、TBA、TAB)。
-
统计字母数量:计算字符串中B、A、T的数量。
-
定义分组边界:根据当前分组顺序,将字符串分为三段,每段对应一个字母。
-
统计错误位置:遍历每段,统计错误字母(即不属于本段的字母)的数量。
-
计算交换次数:
-
直接交换:交换两个错误字母,使它们同时归位(例如,将A段中的B与B段中的A交换)。直接交换次数为各段中可配对错误字母数量的最小值之和。
-
循环交换:处理剩余的错误字母,每三个错误字母(如A段中的B、B段中的C、C段中的A)需要两次交换。循环交换次数为剩余错误字母数量的2倍。
-
总交换次数:直接交换次数 + 循环交换次数。
-
-
取最小值:记录所有分组顺序中总交换次数的最小值。
#include <iostream> #include <vector> #include <climits> #include <algorithm> using namespace std;int main() {string s;cin >> s;int n = s.length();// 统计B、A、T的数量int countB = count(s.begin(), s.end(), 'B');int countA = count(s.begin(), s.end(), 'A');int countT = count(s.begin(), s.end(), 'T');// 定义6种分组顺序vector<string> perms = {"BAT", "BTA", "ABT", "ATB", "TBA", "TAB"};int ans = INT_MAX;for (const string& perm : perms) {char a = perm[0], b = perm[1], c = perm[2];vector<int> cnt(3);// 根据当前分组顺序设置各字母的数量cnt[0] = (a == 'B') ? countB : (a == 'A') ? countA : countT;cnt[1] = (b == 'B') ? countB : (b == 'A') ? countA : countT;cnt[2] = (c == 'B') ? countB : (c == 'A') ? countA : countT;// 定义各段的起始和结束索引int segA_start = 0, segA_end = cnt[0];int segB_start = segA_end, segB_end = segA_end + cnt[1];int segC_start = segB_end, segC_end = n;// 统计各段中的错误字母int in_a_b = 0, in_a_c = 0;int in_b_a = 0, in_b_c = 0;int in_c_a = 0, in_c_b = 0;// 检查A段for (int i = segA_start; i < segA_end; i++) {if (s[i] == b) in_a_b++;else if (s[i] == c) in_a_c++;}// 检查B段for (int i = segB_start; i < segB_end; i++) {if (s[i] == a) in_b_a++;else if (s[i] == c) in_b_c++;}// 检查C段for (int i = segC_start; i < segC_end; i++) {if (s[i] == a) in_c_a++;else if (s[i] == b) in_c_b++;}// 计算直接交换次数int direct_swaps = min(in_a_b, in_b_a) + min(in_a_c, in_c_a) + min(in_b_c, in_c_b);// 计算剩余错误字母数量int remaining_errors = (in_a_b - min(in_a_b, in_b_a)) + (in_a_c - min(in_a_c, in_c_a));// 总交换次数 = 直接交换次数 + 2 * 剩余错误字母数量int total_swaps = direct_swaps + 2 * remaining_errors;ans = min(ans, total_swaps);}cout << ans << endl;return 0; }
交换次数说明
-
直接交换:处理可以两两配对并一次性归位的错误字母,每对交换次数为1。
-
循环交换:处理剩余错误字母(形成循环依赖),每三个错误字母需要两次交换。例如,A段中的B、B段中的T、T段中的A,需两次交换才能全部归位。
-
总交换次数:直接交换次数加上循环交换次数,所有分组顺序中的最小值即为最终答案。
相关文章:
[蓝桥杯]交换次数
交换次数 题目描述 IT 产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称 BAT )在某海滩进行招聘活动。 招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:BABTATT,这使…...

95套HTML高端大数据可视化大屏源码分享
概述 在大数据时代,数据可视化已成为各行各业的重要需求。这里精心整理了95套高端HTML大数据可视化大屏源码,这些资源采用现代化设计风格,可帮助开发者快速构建专业的数据展示界面。 主要内容 1. 设计风格与特点 采用…...
系统架构设计综合知识与案例分析
system-architect 软考高级-系统架构设计师-综合知识与案例分析:软件工程、网络工程、结构化分析方法、面向对象分析方法、软件质量数量、传统数据库、分布式数据库、系统架构等。 —— 2025 年 3 月 20 日 甲辰年二月二十一 春分 目录 system-architect1、计算机基…...

scale up 不能优化 TCP 聚合性能
scale up 作为一种系统扩展优化的方法,旨在提高系统组件的执行效率,比如替换更高性能的硬件或算法。是否可以此为依据优化 TCP 呢,例如通过多条路径聚合带宽实现吞吐优化(对,还是那个 MPTCP),答案是否定的。 因为 TCP…...

Python-matplotlib库之核心对象
matplotlib库之核心对象 FigureFigure作用Figure常用属性Figure常用方法Figure对象的创建隐式创建(通过 pyplot)显式创建使用subplots()一次性创建 Figure 和 Axes Axes(绘图区)Axes创建方式Axes基本绘图功能Axes绘图的常用参数Ax…...

Linux 脚本文件编辑(vim)
1. 用户级配置文件(~/.bashrc) vim ~/.bashrc # 编辑 source ~/.bashrc # 让编辑生效 ~/.bashrc 文件是 Bash Shell 的配置文件,用于定义用户登录时的环境变量、别名、函数等设置。当你修改了 ~/.bashrc 文件后,通常需要重新…...

学习BI---基本操作---数据集操作
什么是数据集, 数据集(Dataset) 是指从原始数据源(如数据库、Excel、API等)提取并经过标准化处理后的数据集合,通常以二维表形式存储,用于支撑报表、仪表盘等可视化分析。 数据集在QuickB…...

初学大模型部署以及案例应用(windows+wsl+dify+mysql+Ollama+Xinference)
大模型部署以及案例应用(windowswsldifymysqlOllamaXinference) 1.wsl 安装①安装wsl②测试以及更新③安装Ubuntu系统查看系统以及版本安装Ubuntu系统进入Ubuntu系统 2、docker安装①下载安装包②安装③docker配置 3、安装dify①下载dify②安装③生成.en…...
AI Agent企业级生产应用全解析
在企业级应用中,AI Agent 的核心是将其从一个对话模型转变为一个自主决策和执行的自动化工作流引擎。这需要一个精密的 “Agent 执行框架”(Agent Orchestration Framework) 来协调 LLM 的推理、外部工具的调用、记忆管理和自我反思。 AI Ag…...
RocketMQ 学习
消息队列 参考官方文档:https://rocketmq.apache.org/zh/docs/ 基本概念 主题(Topic):是消息传输和消息存储的顶级容器,不是实际的消息容器,而是一个逻辑上的概念,用于区分不同业务消息的标识&…...
【前端】html2pdf实现用前端下载pdf
npm安装完后,编写代码。 <template><div id"pdf-content">需要被捕获为pdf的内容</div> </template><script> import html2pdf from html2pdf.js;export default {methods: {downloadPdf() {const element document.getE…...

Redis部署架构详解:原理、场景与最佳实践
Redis部署架构详解:原理、场景与最佳实践 Redis作为一种高性能的内存数据库,在现代应用架构中扮演着至关重要的角色。随着业务规模的扩大和系统复杂度的提升,选择合适的Redis部署架构变得尤为重要。本文将详细介绍Redis的各种部署架构模式&a…...
前端开发知识体系全景指南
文章目录 前言前端开发者知识体系清单一、JavaScript基础变量和类型原型和原型链作用域和闭包执行机制语法和API 二、HTML和CSSHTMLCSS手写 三、计算机基础编译原理网络协议设计模式 四、数据结构和算法JavaScript编码能力手动实现前端轮子数据结构算法 五、运行环境浏览器API浏…...

C++哈希表:unordered系列容器详解
本节目标 1.unordered系列关联式容器 2.底层结构 3.模拟实现 4.哈希的应用 5.海量数据处理面试题 unordered系列关联式容器 在c98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可以达到logN,即最差的情况下需要比较红…...
vue-13(延迟加载路由)
用于性能优化的延迟加载路由 延迟加载路由是优化 Vue.js 应用程序性能的关键技术,尤其是那些具有大量路由的应用程序。通过仅在实际需要时加载路由组件,您可以显著减少应用程序的初始加载时间,从而获得更好的用户体验。这对于网络连接速度较…...
pom.xml 文件中配置你项目中的外部 jar 包打包方式
使用 system 作用域(不推荐,但简单直接) <dependency><groupId>com.test</groupId> <!-- 可自定义,建议与项目相关 --><artifactId>open-sdk</artifactId> <!-- 可自定义,建议…...

WordPress通过简码插入bilibili视频
发布于:Eucalyptus-Blog 一、前言 B站是国内非常受欢迎的视频分享平台,上面不仅内容丰富,而且很多视频制作精良、趣味十足。很多人,比如我,就喜欢将B站的视频通过 iframe 嵌入到自己的网页中,但这段代码又…...

ZLG ZCANPro,ECU刷新,bug分享
文章目录 摘要 📋问题的起因bug分享 ✨思考&反思 🤔摘要 📋 ZCANPro想必大家都不陌生,买ZLG的CAN卡,必须要用的上位机软件。在汽车行业中,有ECU软件升级的需求,通常都通过UDS协议实现程序的更新,满足UDS升级的上位机要么自己开发,要么用CANoe或者VFlash,最近…...

黑马k8s(十七)
一:高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc,观察状态: 4.高级存储-pc和pvc的生命周期 二:配置存储 1.配置存储-ConfigMap 2.配…...

掌握HttpClient技术:从基础到实战(Apache)
目录 前言 一、Apache HttpClient简介 二、HttpClient基础使用 1. 添加依赖 2. 创建HttpClient实例 3. 发送GET请求 4. 发送POST请求 三、HttpClient高级配置与实战案例 1. 连接池优化 2. 超时与重试配置 3. 文件上传(Multipart) 总结 前言 …...
KEYSIGHT N9320B是德科技N9320B频谱分析仪
KEYSIGHT N9320B是德科技N9320B频谱分析仪 附加功能: 频率范围:9 kHz 至 3 GHz 分辨率带宽:10 Hz 至 1 MHz DANL:-130 dBm,-148 dBm,带可选前置放大器 整体幅度精度:<1.5 dB 最小非零扫…...
EXSI通过笔记本wifi上外网配置
我有一台服务器安装了EXSI,服务器IP地址配置的是192.168.137.2,在EXSI中创建了一个linux虚拟机,ip地址是192.168.137.22。现在我有一个windows笔记本,使用家庭的wife上外网,wife给自动分配了一个192.168.0.106地址&…...
Java异常处理的全面指南
Java异常处理的全面指南 一、Java异常的基础概念1.1 什么是异常1.2 异常类的层次结构 二、Java异常的处理方式2.1 try-catch块2.2 throws关键字2.3 throw关键字 三、自定义异常3.1 自定义受检异常3.2 自定义非受检异常 四、Java异常处理的最佳实践4.1 捕获合适粒度的异常4.2 避…...

sql知识梳理(超全,超详细,自用)
目录 通识 查询的基本语法 数据库(database)操作 表(table)的操作 表中列的操作 索引操作 表中行的操作 insert into语句 update语句 删除语句 select语句 表与表之间的关系 连接查询 子查询 视图 数据备份与还原 …...

[ Qt ] | QPushButton常见用法
目录 绑定键盘快捷键 前面已经说了很多用法了,下面主要说说绑定键盘,设置Icon图片。 绑定键盘快捷键 实现四个按钮,可以使用wsad来控制另一个按钮的上下左右的移动。 #include "widget.h" #include "ui_widget.h"Wid…...
WEB3——为什么做NFT铸造平台?
相必之前看过我的入门项目推荐关于简易NFT铸造平台的文章。会有一些疑惑 WEB3—— 简易NFT铸造平台(ERC-721)-入门项目推荐-CSDN博客 WEB3,我直接在https://nft.storage网站里上传图片不行吗,必须用合约铸造NFT? 我做…...

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!
介绍 3DP Chip 是一款免费的驱动程序更新工具,可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用:用户界面简洁明了,操作方便,…...

【机器学习基础】机器学习入门核心:数学基础与Python科学计算库
机器学习入门核心:数学基础与Python科学计算库 一、核心数学基础回顾1. 函数与导数2. Taylor公式3. 概率论基础4. 统计量5. 重要定理6. 最大似然估计(MLE)7. 线性代数 二、Python科学计算库精要1. NumPy:数值计算核心2. SciPy&…...

上交具身机器人的视觉运动导航!HTSCN:融合空间记忆与语义推理认知的导航策略
作者:Qiming Liu 1 ^{1} 1, Guangzhan Wang 2 ^{2} 2, Zhe Liu 3 , 4 ^{3,4} 3,4 and Hesheng Wang 1 , 3 , 5 , 6 ^{1,3,5,6} 1,3,5,6单位: 1 ^{1} 1上海交通大学自动化系, 2 ^{2} 2上海交通大学软件学院, 3 ^{3} 3上海交通大学教…...

【C++并发编程01】初识C++并发编程
1、并发是什么 并发是指两个或更多独立的活动同时发生,现实生活中常见的并发场景如边吃饭边看手机。 1.1、计算机中的并发: 计算机领域的并发是指在单个系统里同时执行多个独立的任务,而非顺序的进行一些活动。 我们在电脑上能够边听音乐边和…...