news 2026/6/10 10:56:27

hh的蓝桥杯每日一题(交换瓶子)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hh的蓝桥杯每日一题(交换瓶子)

15.交换瓶子 - 蓝桥云课

方法一:贪心做法

  • 对于位置 i,如果 a[i] ≠ i

  • 就把 a[i] 和 a[a[i]] 交换(把当前数字放到它应该去的位置)

  • 这样每次交换都能让至少一个数字归位

  • 重复直到 a[i] = i

#include<iostream> using namespace std; const int N = 10010; int n; int a[N]; int main() { cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i]; } int ans = 0; // 贪心:直接把每个数放到正确位置 for(int i = 1; i <= n; i++) { while(a[i] != i) { // 如果当前位置的数不对 swap(a[i], a[a[i]]); // 把它和它应该在的位置交换 ans++; } } cout << ans << endl; return 0; }

方法二:利用环的性质(交换排序最小交换问题)

这个问题实际上可以转化为图论中的环分解问题

  • 把排列看作一个置换(permutation)

  • 每个元素应该回到它的正确位置(值 i 应该在位置 i)

  • 通过交换操作,我们可以将排列分解为若干个环

  • 最小交换次数 = 所有环的大小之和 - 环的个数

#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N = 10010; // 题目说 N<10000,所以开大一点 int n; int a[N]; bool st[N]; // 标记数组,记录位置是否访问过 int main() { cin >> n; for(int i = 1; i <= n; i++) // 注意:题目瓶子编号从1开始 { cin >> a[i]; } int ans = 0; // 遍历所有位置 for(int i = 1; i <= n; i++) { // 如果当前位置的值不是 i,且没有被访问过 if(a[i] != i && !st[i]) { // 找到当前元素所在的环 int j = i; int cnt = 0; // 环的大小 while(!st[j]) { st[j] = true; // 标记已访问 j = a[j]; // 跳到这个位置应该放的元素的位置 cnt++; } // 环的大小为 cnt,需要 cnt-1 次交换 ans += (cnt - 1); } } cout << ans << endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 13:47:06

STM32串口DMA实时性保障机制深度剖析

如何让STM32串口通信真正“零等待”&#xff1f;DMAIDLE机制实战全解析你有没有遇到过这样的场景&#xff1a;系统正在处理一个关键控制任务&#xff0c;突然蓝牙模块发来一串数据&#xff0c;结果因为串口中断太频繁&#xff0c;导致电机响应延迟&#xff1b;接收不定长JSON配…

作者头像 李华
网站建设 2026/6/5 5:20:25

OTG连接键盘鼠标:提升移动办公效率

用一根线把手机变电脑&#xff1a;OTG连接键盘鼠标的实战全解析你有没有过这样的经历&#xff1f;在机场候机时突然要改一份PPT&#xff0c;手指在虚拟键盘上反复敲错字&#xff1b;或者用平板远程登录服务器&#xff0c;却因为没有鼠标而无法精准选中命令行。这些场景下&#…

作者头像 李华
网站建设 2026/6/10 15:40:22

单词接龙问题

本文参考代码随想录 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列&#xff1a; 序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典 wordList 中的单词。…

作者头像 李华
网站建设 2026/6/8 15:09:21

冗余连接II

本文参考代码随想录 在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&#xff0c;所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点&#xff0c;而根节点没有父节点。 输入一个有向图&#xff0c;该图由一个有…

作者头像 李华
网站建设 2026/6/10 16:18:29

Winhance v26.01.12 便携版:Windows 系统优化工具

Winhance v26.01.12 便携版是专为 Win10/Win11 打造的专业 Windows 系统优化工具&#xff0c;无需重装系统就能解决电脑卡顿、系统冗余等问题&#xff0c;帮助用户实现系统瘦身与性能提升&#xff0c;让新旧电脑都能拥有流畅运行体验&#xff0c;是 Windows 系统优化领域的实用…

作者头像 李华
网站建设 2026/6/10 12:46:13

STM32中I2C重入问题与中断处理图解说明

STM32中I2C重入问题与中断处理实战解析一个传感器读取失败的“灵异事件”你有没有遇到过这样的情况&#xff1a;系统运行几分钟都正常&#xff0c;突然一次温湿度数据跳变成0&#xff1f;或者日志里某个时间戳写进了错误的值&#xff1f;调试时用逻辑分析仪一抓——发现I2C总线…

作者头像 李华