Sort with Swap(0, i)
原题连接:https://pta.patest.cn/pta/test/16/exam/4/question/678
题目如下:
Given any permutation of the numbers {0, 1, 2,..., N−1N-1N−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 NNN nonnegative integers.
Input Specification:
Each input file contains one test case, which gives a positive NNN (≤105\le 10^5≤105) followed by a permutation sequence of {0, 1, ..., N−1N-1N−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个数字的排列是有若干个独立的环组成”,并结合题目要求,则元素“0”相当于表排序中的“空位”,因此可以进行如下讨论:
(1)如果环是单环,那么表示该元素已经在其正确的位置,无需排序;
(2)如果环是多环(环的元素个数为N0)且包含元素0,0相当于空位,那么每次将0和该位置本来有的元素经行交换,是原来0在的位置上填上正确的元素,那么经过N0-1次交换,即可完成该环内的正
确排序;
(3)如果环为多环(环的元素的个数为Ni)且不包含0,那么先让0和环内任一元素进行交换将0换进来,此时利用(2)中的结论,改环需要进行(Ni+1)-1次交换即可完成环内的正确排序,但由于把
0换进该环多一次交换,故总的交换次数为Ni+1。
因此,当待排序列的第一个数不为0时,则该序列可分为以上三种环,且(2)环的个数只能为1。设有S个单环,K个多环,则总的交换次数为(N0-1)+(Ni+1)(i从1到K-1),即Ni+K-2(i从1到K),
又Ni(i从1到K)等于N-S,故总的交换次数为:N-S+K-2;
但是,当待排序列的第一个数为0时,那么(2)环的个数为0,(3)环的个数即为K,因此该公式修改为Ni+1(i从1到K),即N-S+K;
除此之外,还应该考虑到待排序列已经正确(包括S==N 和N==1)两种情况,此时输出为0。
#include<stdio.h>
#define Max 100000 int main()
{
int A[Max],Table[Max],flag[Max],N;
int i,tmp,S,K;
S=K=;
scanf("%d",&N);
for (i=;i<N;i++)
{
scanf("%d",&A[i]);
flag[i]=; //标识元素访问过了没有
}
/* 指针数组,用来存放正确的序号 */
for (i=;i<N;i++)
{
Table[A[i]]=i; //即元素A[i]存放在序号i中
} for (i=;i<N;i++)
{
if (flag[i]==)
{
if (Table[i]!=i)
{
flag[i]=;
tmp=Table[i];
while(flag[tmp]==)
{
flag[tmp]=;
tmp=Table[tmp];
}
K++;
}
else if (Table[i]==i)
{
flag[i]=;
S++;
}
}
}
if (A[]==)printf("%d",N-S+K);
else if (S==N)printf("");
else printf("%d",N-S+K-);
return ;
}
Sort with Swap(0, i)的更多相关文章
- PAT 1067. Sort with Swap(0,*)
1067. Sort with Swap(0,*) (25) Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy ...
- Pat1067:Sort with Swap(0,*)
1067. Sort with Swap(0,*) (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue G ...
- 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 ...
- PAT1067. Sort with Swap(0, *) (25) 并查集
PAT1067. Sort with Swap(0, *) (25) 并查集 题目大意 给定一个序列, 只能进行一种操作: 任一元素与 0 交换位置, 问最少需要多少次交换. 思路 最优解就是每次 0 ...
- pat1067. Sort with Swap(0,*) (25)
1067. Sort with Swap(0,*) (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue G ...
- PTA 10-排序6 Sort with Swap(0, i) (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/678 5-16 Sort with Swap(0, i) (25分) Given a ...
- 7-16 Sort with Swap(0, i)(25 分)
7-16 Sort with Swap(0, i)(25 分) Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy ...
- 1067. Sort with Swap(0,*) (25)【贪心】——PAT (Advanced Level) Practise
题目信息 1067. Sort with Swap(0,*) (25) 时间限制150 ms 内存限制65536 kB 代码长度限制16000 B Given any permutation of t ...
- PAT 甲级 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 ea ...
- PTA 1067 Sort with Swap(0, i) (贪心)
题目链接:1067 Sort with Swap(0, i) (25 分) 题意 给定长度为 \(n\) 的排列,如果每次只能把某个数和第 \(0\) 个数交换,那么要使排列是升序的最少需要交换几次. ...
随机推荐
- java 持久框架mybatis的初步学习
什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...
- SQL语法和运算符(一)
一个数据库通常包含一个或多个表.每个表由一个名字标识,表包含带有数据的记录(行). 一些最重要的SQL命令(SQL对大小写不敏感): 一.SQL语法 select:从数据库中提取数据 update:更 ...
- iOS让键盘消失,取消第一响应,取消一级响应
在开发中经常会遇到输入文本内容的时候,输入完毕的时候怎么让键盘消失的问题,有的是更改键盘的按键的方法,有的是点击屏幕的其他地方让键盘消失,个人更倾向于第二种,点击屏幕的其他地方让键盘消失,要实现这种方 ...
- Asp.net平台下网站性能调优的实战方案(转)
转载地址:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来 ...
- 学习EXT.JS5时的重点载图
组件实例化的五种方式,最后一种不建议了 MVVM的图示,及controller的生存周期和MVC的不一样. VIEWCONTROLLER如何得到VIEW的实例呢,注意LOOKUPREFERENCE的使 ...
- Git版本控制管理学习笔记5-提交
这个标题其实有些让人费解,因为会想这个提交是动词还是名称? 提交动作是通过git commit命令来实现的,提交之后会在对象库中新增一个提交对象.提交过程中会发生哪些变化,在上一篇笔记 ...
- ubuntu 14.04下spark简易安装
java安装 首先需要上oracle的网站下载 在lib目录下建立一个jvm文件夹 sudo mkdir /usr/lib/jvm 然后解压文件到这个文件夹 sudo tar zxvf jdk-8u4 ...
- Log4Net记录日志的使用
Log4net 基本样式: <log4net> <appender name="LogFileAppender" type="log4net.Appen ...
- 简单谈谈NFC(转载自-tlex/pku_android)
NFC是Near Field Communication缩写,又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输(在十厘米内)交换数据.这个技术由免接触式射 ...
- 【iOS atomic、nonatomic、assign、copy、retain、weak、strong】的定义和区别详解
一.atomic与nonatomic 1.相同点 都是为对象添加get和set方法 2.不同点 atomic为get方法加了一把安全锁(及原子锁),使得方法get线程安全,执行效率慢 nonatomi ...