传送门:点我

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 (≤) 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

题目大意:给定n个数字(1到n),且每次只能跟0交换,问换成递增的最少步数。思路:核心是让每次交换尽量都把0和当前0这个位置的数组下标,这两个数换位置,这样就不浪费这一次交换。记录下每个元素所在的位置存入数组pos,即pos数组存放的是pos[number]=ard,表示Number这个数字当前在ard这个位置如果0不在第0个位置,那么每次可以交换0位置和0所在位置在递增之后应该有的元素。比如说4 0 3 1 2。先把0和pos[0],即0和1交换,这样1就在它本来应该在的位置。数组变成了4 1 3 0 2,再交换,直到0回到了下标0这个位置。这样一趟下来保证了每次操作都是有意义的,即每次交换都能把一个元素放回它应该在的位置。如果这个元素这样交换下来,还没在它应该在的位置,即pos[number]!=number,那就让它去0呆着,下次交换会把它放回应该属于它的位置的。参考博客:点我

代码:
#include<bits/stdc++.h>
using namespace std;
int pos[100001];
int main()
{int n;scanf("%d",&n);for(int i = 0 ; i < n ; i ++){int x;scanf("%d",&x);pos[x] = i;}int cnt = 0;for(int i = 0; i < n ; i ++){if(pos[i] != i){while(pos[0] != 0){swap(pos[0],pos[pos[0]]);cnt++;}//如果0不在数组下标为0这个位置,那可以不停的交换0所在位置数组下标 和 0这两个元素。 if(pos[i] != i){swap(pos[0],pos[i]);cnt++;}}}printf("%d\n",cnt);
}

 

转载于:https://www.cnblogs.com/Esquecer/p/10524471.html

PTA 1067 Sort with Swap(0, i) (25 分)(思维)相关推荐

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

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

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

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

  3. 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 ...

  4. 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 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. python自学多久可以找到工作-自学Python的高效方法,学Python多久能找到工作?
  2. 微信小程序button授权页面,用户拒绝后仍可再次授权
  3. java mysql 多表查询_解析Mysql多表查询的实现
  4. CVP(Critical Value Pruning)illustration with clear principle in details
  5. 【转】DICOM医学图像处理:基于DCMTK工具包学习和分析worklist
  6. 【QT 数据库专辑】【04】WIN7下搭建本地SQL SERVER数据库 - 手把手-登录远程数据库帐号设定问题
  7. Android实现ListView异步加载图片总结
  8. COJ 0967 WZJ的数据结构(负三十三)
  9. 给vc6对话框添加菜单
  10. 基于群晖DS216+II的家庭存储解决方案
  11. 使用qBittorrent下载bt种子文件
  12. Kafka 面试题(2022)
  13. 教你记录借还款,查看收支账户记录
  14. 计算机鼠标游戏教学法,练习使用鼠标教案
  15. 层次分析法例题 matlab,层次分析法的MATLAB实现
  16. 根下有长长的白色根须
  17. 转载:国学与古代文学的关系
  18. 御坂坂的C++学习之路(1)
  19. 小迪渗透内网渗透(玖)
  20. Aop切面编程原理和Spring实现

热门文章

  1. 机器人视觉——使用numpy进行像素的处理 || 获取图像的属性 || 感兴趣区域ROI || 通道的拆分与合并
  2. Python+selenium 自动化 - 实现自动导入、上传外部文件实例演示
  3. JavaScript 技术篇-js正则表达式匹配字符串左右两边是否包含空格
  4. jQuery知识点笔记-常用方法
  5. Web 性能测试-内存泄漏测试方法之chrome内存快照
  6. C语言用DFS实现找到图的所有路径(邻接矩阵实现)
  7. HTML areamap标签及在实际开发中的应用
  8. scipy模块计算导数方法(central_diff_weights)
  9. css实现一侧开口三角形
  10. 【BZOJ3700】发展城市 [LCA][RMQ]