【PAT甲级 - C++题解】1067 Sort with Swap(0, i)

news2025/1/24 6:35:33

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:PAT题解集合
📝原题地址:题目详情 - 1067 Sort with Swap(0, i) (pintia.cn)
🔑中文翻译:用 Swap(0, i) 操作进行排序
📣专栏定位:为想考甲级PAT的小伙伴整理常考算法题解,祝大家都能取得满分!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

1067 Sort with Swap(0, i)

Given any permutation of the numbers {0, 1, 2,…, N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:

Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}

Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.

Input Specification:

Each input file contains one test case, which gives a positive N (≤105) followed by a permutation sequence of {0, 1, …, N−1}. All the numbers in a line are separated by a space.

Output Specification:

For each case, simply print in a line the minimum number of swaps need to sort the given permutation.

Sample Input:

10
3 5 7 2 6 4 9 0 8 1

Sample Output:

9

题意

现在给定一个序列,需要我们只用 swap(0,*) 操作即其他数只能与 0 进行交换,将该序列变成一个升序序列。

思路

这道题可以转换成图的做法,拿题目例子来看,给定一个序列 {3,5,7,2,6,4,9,0,8,1} ,那么我们可以将每个数指向它目前所在的位置,例如 3 目前在 0 的位置即 3->05 目前在 1 的位置即 5->1 ,可以得到下图:

由于只能和 0 进行交换,当我们把 0 与其环外元素交换时,两个环会合成一个环;而当把 0 与环内元素交换时,又分两种情况,一种是与 0next 元素交换,一种是与不是 0next 元素交换,而第二种得到的结果等于什么都没发生即白操作一次,而第一种就可以使 0next 元素变成自环,例如上面将 07 进行交换,可以得到下面的结果:

所以这就明朗起来了,具体步骤如下:

  1. 如果 0 所在环的元素大于 1 ,就先将 0 与它的 next 元素进行交换,每交换一次,0next 元素就会变成一个自环即指向了自己所在的位置。
  2. 如果 0 所在环只有 0 自己了,就去看看外面是否还有元素个数大于 1 的环。如果有,就将这个环中任意一个元素与 0 进行交换,这样 0 就加入到这个环中了,然后再重复步骤 1 直至环里元素都变成自环。
  3. 记录上述交换的次数,最后输出最终交换次数。

代码

#include<bits/stdc++.h>
using namespace std;

const int N = 100010;
int p[N];
int n;

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int id;
        cin >> id;
        p[id] = i;    //将序列中的元素位置转换成图
    }

    int res = 0;
    for (int i = 1; i < n;)
    {
        //如果0所在环不只1个元素,则将0和它指向的下一个元素进行交换
        while (p[0]) swap(p[0], p[p[0]]), res++;
        //如果当前元素已经在对应位置上即已形成自环,则跳过
        while (i < n && p[i] == i) i++;
        //如果还存在除0所在环外,元素个数大于0的环,则将0加入该环
        if (i < n) swap(p[0], p[i]), res++;
    }

    //输出交换次数
    cout << res << endl;

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【关于时间序列的ML】项目 3 :基于机器学习的地震预测模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Datawhale powerful-numpy《从小白到入门》学习笔记

Datawhale powerful-numpy《从小白到入门》学习笔记 持续更新中 文章目录Datawhale powerful-numpy《从小白到入门》学习笔记摘自官方文档的一些话What is NumPy?Why is NumPy Fast?Who Else Uses NumPy?一.创建和生成1.从python列表或元组创建从列表创建从元组创建2.使用ar…

基于ISO13209(OTX)实现引导诊断

在上篇文章《基于ISO13209&#xff08;OTX&#xff09;实现EOL下线序列》中&#xff0c;讲到了OTX的由来以及OTX在EOL中的实现案例&#xff0c;而本文将讲述OTX的另一个广阔应用场景——定义引导诊断序列。 一 何为引导诊断&#xff1f; 引导诊断&#xff0c;通常也称为“引导…

市面上有哪些自动生成报表的工具?

每到月末、季度、年底&#xff0c;就是企业里各营销、财务、运营、企管等各部门“摆数据、晒业绩”的时候&#xff0c;除了财务因为有规范的制度约束&#xff0c;在规则和工具上更有保障&#xff08;最常见的就是在财务软件/ERP 里面自动生成三大周报&#xff09;之外&#xff…

GoPass系列免杀基础(一)

Goby社区第 23 篇插件分享文章 全文共&#xff1a;7730 字 预计阅读时间&#xff1a;20 分钟 小板凳提示&#xff1a;过数字全家桶&#xff08;开启晶核&#xff09;、某绒、卡巴、WD、某管家、魔法保姆、机器人、橘子&#xff0c;全程新手简单版&#xff0c;欢迎师傅们来交流…

一个被迫毕业面试 30 家公司,终于上岸了的Java老前辈的经验分享!

今天分享一个朋友的经历&#xff0c;被“毕业”后的求职经历&#xff1a; 在老东家干了 6 年&#xff0c;发展一般&#xff0c;很想出去&#xff0c;但是一直没有合适的机会&#xff0c;只好一边准备面试一边学习。让我没有想到的是&#xff0c;突然收到了“毕业”通知&#x…

大数据Kudu(十):Flink操作Kudu

文章目录 Flink操作Kudu Flink操作Kudu Flink主要应用场景是流式数据处理上,有些公司针对流式数据使用Flink实时分析后将结果存入Kudu,例如快手公司。这里将实时计算的结果存入Kudu需要自定义Flink Kudu Sink。 场景:Flink实时读取Socket数据,将结果存入Kudu表t_flink_re…

详解OpenCV的椭圆绘制函数ellipse()

函数ellipse()用于在图像上绘制椭圆。 有两种原型&#xff0c;这里只列出常用的那种。 C原型如下&#xff1a; void cv::ellipse(InputOutputArray img,Point center,Size axes,double angle,double startAngle,double endAngle,const Scalar & color,int thickness 1,…

地统计插值学习心得(三)ArcGIS Pro与ArcMap软件中地统计分析的区别

前言 ArcMap中地统计分析由来已久,很多GIS专业的同学学习地统计内容都是在ArcMap软件中实现的,随着IT技术的发展,ArcGIS系列软件架构也发生了重大变化,传统的ArcMap软件已不太能够满足当前的应用需求,在此背景下,ESRI推出了64位的ArcGIS Pro桌面软件,来实现二三维一体化…

【关于时间序列的ML】项目 4 :使用机器学习预测迁移

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【关于2022年卡塔尔世界杯】

2022卡塔尔世界杯最全面的看点和分析&#xff0c;相信一定有你感兴趣的一点&#xff0c;相信一定会有你感兴趣的&#xff0c;推荐点赞收藏~~ 2022年世界杯比以往任何时候都晚&#xff0c;因为卡塔尔太热了…… 然而&#xff0c;四年一度的世界杯终于……来了 今年的世界杯&am…

非零基础自学Golang 第14章 反射 14.1 反射定义

非零基础自学Golang 文章目录非零基础自学Golang第14章 反射14.1 反射定义14.1.1 反射的定义14.1.2 与其他语言的区别第14章 反射 我们常用的一个打印函数fmt.Println()可以打印任何类型的数据&#xff0c;但是它本身是怎么实现的呢&#xff1f; 解读源码可以看到&#xff0c…

人员定位系统如何实现对人、车、物的安全管控?

人员定位系统是采用物联网设计理念&#xff0c;通过结合定位基站、视频监控、人脸抓拍、巡更、门禁、道闸、梯控等系统&#xff0c;对管控区域工作人员、访客、巡检人员进行精细化、规范化、智能化理。 智慧安全的概念随着物联网技术的发展逐渐成为发展趋势&#xff0c;人员定位…

【Python机器学习】卷积神经网络Vgg19模型预测动物类别实战(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 典型神经网络 在深度学习的发展过程中&#xff0c;出现了很多经典的卷积神经网络&#xff0c;它们对深度学习的学术研究和工业生产斗起到了促进的作用&#xff0c;如VGG ResNet Inception DenseNet等等&#xff0c;很多实际…

偷偷告诉你!与其辞职,不如用Python做月入过万的副业兼职

我想辞职&#xff01; 这是不是当下的你&#xff1f;在这个疫情当下的时代&#xff0c;许多打工人都有过这么一个想法&#xff0c;或许是因为工作待遇、亦或许是其他原因&#xff0c;但是却仍然屹立在工位上&#xff0c;有的甚至天天喊辞职&#xff0c;月月拿满勤。这是为什么…

阿里大牛解析微服务架构:Docker,Spring全家桶,分布式,数据库

前言 微服务架构&#xff08;Microservice Architecture&#xff09;是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的类上应用很多SOLID原则。微服务架构是个很有趣的概念&#xff0c;它的…

【愚公系列】2022年12月 使用Jenkins实现程序的自动化发布

文章目录前言一、使用Jenkins实现程序的自动化发布1.安装Jenkins二、安装Gitee插件前言 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进…

如何用 Prometheus 和 Grafana 实现集群的监控预警

在读写、查询等高并发场景中&#xff0c;了解资源的使用情况能快速定位性能的瓶颈所在。本教程提供对多&#xff08;或单&#xff09;服务器及 DolphinDB 高可用集群&#xff08;或单节点&#xff09;资源的监控、告警、预警方案。本教程使用开源软件 Prometheus, Grafana 及对…

Git实战(四)| Git分支管理实操,搞定在线合并和本地合并

类似于SVN这种集中式版本管理&#xff0c;三年前刚来上海工作时候&#xff0c;在华为驻场上班&#xff0c;华为用的就是SVN&#xff0c;印象最深的就是那个小乌龟的图标&#xff1b;后来到外面工作&#xff0c;渐渐发现用Git的非常多&#xff0c;慢慢学习了解发现Git这种分布式…

5年Crud的我,啃完这份Java王者级核心宝典,成功入职阿里(P7)

我有话要说&#xff0c;请仔细看完 我发现一个现象&#xff0c;很多开发5年的程序员仍然停留在crud的阶段&#xff0c;这是什么原因&#xff1f;最主要的原因就是基础很差&#xff0c;尤其对于JVM和并发编程这方面掌握的比较差&#xff0c;而JVM和并发编程就是非常非常重要的基…