题目如下:

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

题目要求从一个由0到N-1的数据组成的线性表中,只允许进行0和*交换,来完成升序排序。

一个自然的思路,就是让0把正确的元素换到自己的位置,例如开始0在8位置,则把8换过来,让原来8的位置换成0,这样多次重复就可完成元素的归位。需要注意的是,中途可能出现0出现在0位的情况,例如0在3号位,而3恰好在0号位,则0到了0位置,但是排序并未结束。

这时候应该让0和最近的一个错误位置元素交换,然后继续上面的过程。

还有个关键的问题是判断排序的结束, 注意到上面需要用到错误位置的元素,因此设计一个函数每次从位置1开始找错误元素,如果找不到返回0,注意不要从0开始找,这样只要找到的位置不是0,则说明还有未完成排序的元素,如果从0开始找,就无法判断是否排序结束了,因为我们用0判断是否找不到,并且我们不必担心第一个错误位置是0的情况,这个属于0在0位置但排序未完成的情况,在下面有处理。

上面说的比较乱,总结如下:

①从位置1开始查找错误位置,找不到返回0,找到返回相应位置。

②如果查找函数返回0,说明排序结束,直接结束,否则进入③。

③如果0已经归位,但是排序没有结束,如果0不动无法继续排序,这时候让0和上面得到的错误位置交换,这个交换属于无用交换,但必须进行。

④在0没有归位的情况下,不断地把0的位置和应该在这个位置的元素交换,直到0归位,这时候再通过①的查找判断是否结束,没有结束则再继续③、④,直到满足找不到错误位置。

下面的代码来自tiantangrenjian

#include <stdio.h>int findNotOK(int* arr,int begin,int end)    //从begin开始往后寻找未到位的数
{for(int i=begin;i<end;i++){if(arr[i]!=i)return i;}return 0;
}int main()
{int n;scanf("%d",&n);int* arr = new int[n];int i,t;for(i=0;i<n;i++){scanf("%d",&t);arr[t]=i;}int tmp = 0;int count=0;int firstPos = 1;firstPos = findNotOK(arr,firstPos,n);while(firstPos)     //还有未到位的数字{if(arr[0]==0)      //如果0到位了,则与未到位的firstPos交换{arr[0] = arr[firstPos];arr[firstPos] = 0;count++;}while(arr[0]!=0)    //如果0不到位,则循环与自己所指向的值交换{tmp = arr[0];arr[0] = arr[tmp];arr[tmp] = tmp;count++;}firstPos = findNotOK(arr,firstPos,n);        //此时0归位了,找到下一个未到位的数字}printf("%d\n",count);return 0;
}

转载于:https://www.cnblogs.com/aiwz/p/6154089.html

1067. Sort with Swap(0,*) (25)相关推荐

  1. 1067 Sort with Swap(0, i) (25 分)

    1067 Sort with Swap(0, i) (25 分) Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy ...

  2. PAT甲级1067 Sort with Swap(0, i):[C++题解]此题不是很懂!!

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:y总从图论的角度来讲解的这道题,听得不是很懂. 此题不是很懂,暂留以后探讨.存在鸽的可能. ac代码 #include<bits ...

  3. 1067. Sort with Swap(0,*)

    好弱啊,这个题目折腾了好久. 构造hash表用来维护各个元素所在的位置,利用map维护一颗红黑树来保存还未确定的元素的位置. (1)用0不断的跟其他元素交换,每次交换都会保证一个元素在正确的位置. ( ...

  4. PTA 1067 Sort with Swap(0, i) (25 分)(思维)

    传送门:点我 Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasin ...

  5. 【题意+分析】1067 Sort with Swap(0, i) (25 分)_24行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Given any permutation of the numbers {0, 1, 2,-, N−1}, it is easy ...

  6. 1067 Sort with Swap(0, i) (25 分)【难度: 中 / 知识点: 置换群】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805403651522560 这种相关的题目见过很多次了. 常见的是只可以 ...

  7. PAT A1067 Sort with Swap(0, i) ——天街小雨润如酥,草色遥看近却无

    PAT A1067 Sort with Swap(0, i) 本题使用了姥姥教的方法,通过交换过程(第一个开始动的元素,通过一系列交换到达自己应该在的位置)可以发现他们形成了一个闭环,大家手拉手,每个 ...

  8. 10-排序6 Sort with Swap(0, i) (25 分)

    Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order ...

  9. 算法 排序6 Sort with Swap(0, i) 2013年免试研究生上机考试真题

    全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案 题目:Given any permutation of the numbers {0, 1, 2,..., N−1}, ...

  10. 7-16 Sort with Swap(0, i) | PTA数据结构与算法——C语言实现

    2013年浙江大学免试研究生上机考试真题. 原题链接:PTA | 程序设计类实验辅助教学平台 题目描述 给定包含数字 {0, 1, 2,..., N−1} 的任一排列,很容易对它们进行升序排序. 但是 ...

最新文章

  1. grub设置密码的方法
  2. 因特网的协议集称为TCP/IP协议集
  3. 几种简单的滤波方式(未完)
  4. 【数学建模】非线性规划模型与01规划模型(最优化)
  5. [BUUCTF-pwn]——jarvisoj_level3_x64
  6. 零拷贝(Zero Copy)
  7. Ant 风格路径表达式
  8. docker run命令_CVE-2019-14271:Docker cp命令漏洞分析
  9. 项目分层思路——管家婆
  10. android 可执行程序 root权限,非Root权限的Android上运行可执行文件
  11. 安卓系统手机如何用作电脑摄像头使用及解决方法
  12. 微信jsapi支付流程
  13. 两万元的计算机什么配置,两万高配置电脑使用CAD非常卡顿怎么办
  14. 竖亥——京东以神为名出击,神一样的物流黑科技
  15. 关于“运放“这些知识点
  16. 踩坑到怀疑人生:win10下tensorRT加速YOLOV5
  17. 自制黑科技------桌面整理工具
  18. 开源中国(OSChina)源码解析(1)——源码导入
  19. 二元函数可微与可导的关系_函数连续、可导与可微之间的关系
  20. 【英语】五月,英语如影随形

热门文章

  1. 文件隐藏工具Funter for Mac使用方法
  2. 10x程序员是如何思考的?
  3. 关闭所有的screen
  4. 基于 koajs 的前后端分离实践
  5. php的变量引用与销毁机制
  6. JS写的简单的图片播放器
  7. 条条道路通向SAN iSCSI SAN完全解读之基础篇
  8. Hive2.0中HiveServer2的WEB UI界面
  9. Spark集群worker启动起来,一会停掉原因--尝试
  10. Ubuntu 右键打开终端