交换瓶子【第七届】【省赛】【A组】

题目描述

有N个瓶子,编号 1 ~ N,放在架子上。

比如有5个瓶子:
2 1 3 5 4

要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5

对于这么简单的情况,显然,至少需要交换2次就可以复位。

如果瓶子更多呢?你可以通过编程来解决。

输入输出

输入格式为两行:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。

输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

例如,输入:
5
3 1 2 5 4

程序应该输出:
3

再例如,输入:
5
5 4 3 2 1

程序应该输出:
2

资源约定

峰值内存消耗 < 256M
CPU消耗 < 3000ms

思路

这题思路很巧妙,我们可以将其转化为图论的问题求解。
首先建图,因为是1~N的,所以将a[i]指向a[a[i]],例如第一个样例。

5
3 1 2 5 4

转化成图就行如下所示。
在这里插入图片描述
排好之后的图是这样的。
在这里插入图片描述
所以我们的目的就是将上面的两个环,变成下面的五个环。每次交换两个点,其实就是改变了两条边的指向。比如交换3和2,就变成了2 1 3 5 4。新图就变成了:
在这里插入图片描述
其实就是将一个环变成了两个环。每一次这样的交换都会导致上述结果。那么我们最终是要有 n n n 个环。所以我们只需要求出给出的数据有多少环,然后让 n n n 减去环的数量,就是最少的交换次数。

代码

#include <iostream>
#include <algorithm>using namespace std;const int N = 10010;int n;
int a[N];
bool st[N];int main()
{cin >> n;for ( int i = 1; i <= n; i ++ ) cin >> a[i];int k = 0;for ( int i = 1; i <= n; i ++ )if ( !st[i] ){k ++;for ( int j = i; !st[j]; j = a[j] )st[j] = true;}cout << n - k << endl;return 0;
}

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

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

相关文章

Google插件Sider: ChatGPT Sidebar + GPTs GPT-4 Turbo Sider

Sider: ChatGPT Sidebar 可以使得满屏都是机器人&#xff0c;左侧栏可以打开访问GPT-4. 配置跳板机地址 google 搜索的右侧也有打开

ElasticSearch聚合操作

目录 ElasticSearch聚合操作 基本语法 聚合的分类 后续示例数据 Metric Aggregation Bucket Aggregation ES聚合分析不精准原因分析 提高聚合精确度 ElasticSearch聚合操作 Elasticsearch除搜索以外&#xff0c;提供了针对ES 数据进行统计分析的功能。聚合(aggregation…

Day32 文件属性 目录操作 库

文章目录 获取文件属性1.stat函数2.获取文件属性3.获取文件权限4.stat/fstat/lstat的区别&#xff1f; 目录操作库 Lib1.库的定义2.库的分类2.1 静态库2.2 动态库 3.静态库的制作4.动态库制作5.总结静态库和动态库 获取文件属性 1.stat函数 int stat(const char *path, struc…

C#,二叉搜索树(Binary Search Tree)的迭代方法与源代码

1 二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;又称二叉查找树或二叉排序树。 一棵二叉搜索树是以二叉树来组织的&#xff0c;可以使用一个链表数据结构来表示&#xff0c;其中每一个结点就是一个对象。 一般地&#xff0c;除了key和位置…

uni-app 开发调试自动打开手机屏幕大小界面(Aidex移动端开发项目)

上效果&#xff1a; 下载Aidex的移动端项目并打开&#xff1a; 若依-ruoyi-AiDex-Uniapp: 若依-Ruoyi APP 移动解决方案&#xff0c;基于uniappuView封装的一套基础模版&#xff0c;开箱即用&#xff0c;免费开源&#xff0c;一份代码多终端适配&#xff0c;支持H5、支付宝小程…

Kotlin基础 7

1.apply函数详解 1.1. DSL /*** 为什么要传入扩展函数(泛型),而不是一个普通的匿名函数* T.()->Unit* 扩展函数里自带了接收者对象的this隐式调用* 为什么是泛型的扩展函数?* 因为是由this 隐式调用 this 类型就是泛型类型&#xff0c; 相当于this的扩展函数&#xff0c;…

Aidex移动端项目入门

运行效果 项目源码下载 若依-ruoyi-AiDex-Uniapp: 若依-Ruoyi APP 移动解决方案&#xff0c;基于uniappuView封装的一套基础模版&#xff0c;开箱即用&#xff0c;免费开源&#xff0c;一份代码多终端适配&#xff0c;支持H5、支付宝小程序、微信小程序、APP&#xff0c;实现了…

解决MobaXterm网络错误连接超时问题

报错页面&#xff1a; 报错原因&#xff1a; ①网络断开了 ②网络端口&#xff0c;端口号改变 解决办法&#xff1a; ①重新连接网络按R ②固定端口号 第一步&#xff1a;编辑------>虚拟机网络编辑器&#xff08;我的Linux在虚拟机里&#xff09; 第二步&#xff1a;用…

Chrome插件精选 — 缓存清理

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. Chrome清理大师…

如何画架构图:从概念到实践

如何画架构图&#xff1a;从概念到实践 免费在线作图工具&#xff0c;点击邀请链接注册赠送7天会员&#xff1a;https://www.processon.com/u/5d3967afe4b0208611113845 在软件开发和系统设计中&#xff0c;架构图是一种重要的工具&#xff0c;它能够帮助开发人员和利益相关者…

嵌入式Qt 计算器核心算法_2

一.中缀表达式转后缀表达式 中缀表达式是最常用的算术表达式形式——运算符在运算数中间。但运算时需要考虑运算符优先级。 ​后缀表达式是计算机容易运算的表达式&#xff0c;运算符在运算数后面&#xff0c;从左到右进行运算,无需考虑优先级,运算呈线性结构。 1 2 * 3// …

打败茅台的“老酒”

作者&#xff1a;翻篇 琥珀酒研社快评&#xff1a; 最可恨的 从来不是什么强大敌人 而是美名其曰的猪队友 要不怎么有网友说 酒鬼酒太惨了 当年要不是败给内鬼 又曝出塑化剂事件 错过白酒发展的黄金十年 不说打败茅台、五粮液 但成为另一个茅台、五粮液 那完全有希…