1224. 交换瓶子
题目链接
1224. 交换瓶子
有 个瓶子,编号 ,放在架子上。
比如有 个瓶子:
要求每次拿起 个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
对于这么简单的情况,显然,至少需要交换 次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
输入格式
第一行包含一个整数 ,表示瓶子数量。
第二行包含 个整数,表示瓶子目前的排列状况。
输出格式
输出一个正整数,表示至少交换多少次,才能完成排序。
数据范围
输入样例1:
输出样例1:
输入样例2:
输出样例2:
解题思路
环,置换群
将 连向位置为 上的整数,即 ,其构成 个环,最后一定是形成 个自环,而对于每个环内的整数,交换会增加一个环,交换不同环的两个整数会合并即减少一个环,所以最后至少进行 次即能形成 个自环
贪心
可以想到一个贪心策略:从 枚举,如果不在对应位置上,则将 所在位置和当前数交换,即上述在环内交换两数
- 时间复杂度:
代码
- 贪心
- 置换群
类似题目
1553. 用 Swap(0, i) 操作进行排序
给定一个 的随机排列,将其变为升序排列非常简单。
如果只能使用 Swap(0, *)
操作(将数字 和另一个数字交换位置),使得序列变成升序排列呢?
例如,给定序列 {4, 0, 2, 1, 3}
,我们可以通过下列交换操作,得到升序序列:
现在,请你求出将给定序列按如上交换操作变为升序序列,至少需要多少步操作。
输入格式
第一行包含整数 ,表示序列中元素个数。
第二行包含一个 的随机排列序列。
输出格式
输出所需最少操作步数。
数据范围
1≤N≤10^5$
输入样例:
输出样例:
置换群
和上题类似,不过只能用 交换,用 去合并其他非自环的环,每次合并需要一次交换操作,假设非 自环的个数为 ,环的个数为 ,则需合并 次,其他消成自环 次,共 次
代码
__EOF__

本文作者:acwing_zyy
本文链接:https://www.cnblogs.com/zyyun/p/15890100.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/zyyun/p/15890100.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!