1067 Sort with Swap(0,*) (25)(25 分)

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 (<=10^5^) 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和*进行交换排序,找出最少的操作次数。

//我不太会,我只能想到是的有点像快排,当0所在的下标<n/2时,就从右边开始遍历选最小的数换,反之取最大的数换,但是这样明显不是次数最少的,所以我不会。

代码来自:https://www.liuchuo.net/archives/2301

#include <cstdio>
#include <vector>
using namespace std;
int main() {
int n, num, cnt = , ans = , index = ;
scanf("%d", &n);
vector<int> v(n);
for(int i = ; i < n; i++) {
scanf("%d", &num);
v[num] = i;//保存当前数所在的位置。
if(num != i && num != ) cnt++;
}
while(cnt > ) {
if(v[] == ) {
while(index < n) {
if(v[index] != index) {
swap(v[index], v[]);//直接用swap函数是多么简单。
ans++;
break;
}
index++;
}
}
while(v[] != ) {
swap(v[v[]], v[]);
ans++;
cnt--;
}
}
printf("%d", ans);
return ;
}

//当时看解题思路,似乎懂了一些,但是自己写还是不对,真是绝望,好笨。

1.使用向量记录的是数字所在的位置,而不是当前位置放的是谁,这样就简单了,因为每次都要找数字所在的下标位置。

2.使用index来记录,因为每次循环到index之前的都已经存储好了,index是指数1,数2,数3是否存到了正确的位置。

3.当0不在0的位置上时,一直循环交换即可。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int a[];
int main() {
int n,index=;//index指向0所在的位置。
cin>>n;
int ct=;//标记有多少不在原位的,在原位的肯定就不去挪了。
for(int i=;i<n;i++){
cin>>a[i];
if(a[i]==)
index=i;//标记住i的下标。
if(a[i]!=i&&i!=
)
ct++;
}
int t,no=;
while(ct!=){
if(index!=){
for(int i=;i<n;i++)
if(a[i]==index){
t=i;break;
}
a[t]=;
a[index]=index;
index=t;
ct--;
no++;
}else if(index==){
for(int i=;i<n;i++)
if(a[i]!=i){
t=i;break;
}
if(t==-)break;
a[]=t; a[t]=;
no++;
}
cout<<"hh";
t=-;
}
cout<<no; return ;
}

//终于理解了为什么自己错了,因为当0回到0位置时,应该选取1,2,3依此数字最小的而不是位置上不等于当前位置的!

学习了!

PAT 1067 Sort with Swap[难]的更多相关文章

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

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

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

  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. PTA 1067 Sort with Swap(0, i) (贪心)

    题目链接:1067 Sort with Swap(0, i) (25 分) 题意 给定长度为 \(n\) 的排列,如果每次只能把某个数和第 \(0\) 个数交换,那么要使排列是升序的最少需要交换几次. ...

  6. PAT Advanced 1067 Sort with Swap(0,*) (25) [贪⼼算法]

    题目 Given any permutation of the numbers {0, 1, 2,-, N-1}, it is easy to sort them in increasing orde ...

  7. PAT (Advanced Level) 1067. Sort with Swap(0,*) (25)

    只对没有归位的数进行交换. 分两种情况: 如果0在最前面,那么随便拿一个没有归位的数和0交换位置. 如果0不在最前面,那么必然可以归位一个数字,将那个数字归位. 这样模拟一下即可. #include& ...

  8. 【PAT甲级】1067 Sort with Swap(0, i) (25 分)

    题意: 输入一个正整数N(<=100000),接着输入N个正整数(0~N-1的排列).每次操作可以将0和另一个数的位置进行交换,输出最少操作次数使得排列为升序. AAAAAccepted cod ...

  9. PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法

    贪心算法 次数最少的方法,即:1.每次都将0与应该放置在0位置的数字交换即可.2.如果0处在自己位置上,那么随便与一个不处在自己位置上的数交换,重复上一步即可.拿样例举例:   0 1 2 3 4 5 ...

随机推荐

  1. 13条Android手机必备技巧 让玩机更有趣

    腾讯数码讯(编译:张秀梅)如果你不是一名极客或手机爱好者,那么或许对于手中的Android手机来说,肯定无法做到百分之百了解.对于这款世界上最受欢迎的操作系统来说,有许多不为大部分人所知晓的使用技巧或 ...

  2. Eclipse安装php插件phpeclipse(转)

    1.PHPEclipse是Eclipse的一个用于开发PHP的插件.官网下载地址:http://sourceforge.net/projects/phpeclipse/下载解压后,将features和 ...

  3. css布局 - 九宫格布局的方法汇总(更新中...)

    目录: margin负值实现 祖父和亲爹的里应外合 换个思路 - li生了儿子帮大忙. 借助absolute方位值,实现自适应的网格布局 cloumn多栏布局 grid display: table: ...

  4. 有关xml中的xmlns

    1. xmlns "xmlns"是XHTML namespace的缩写,叫做"名字空间"声明.名字空间是什么作用呢?我的理解是:由于xml允许你自己定义自己的标 ...

  5. sencha touch tpl 实现按钮功能

    js如下: Ext.define('app.view.message.Info', { alternateClassName: 'messageInfo', extend: 'Ext.Containe ...

  6. [转]centos6 与 7 其中的一些区别

    # vi /etc/ssh/sshd_config #将MaxAuthTries注释去掉 MaxAuthTries 5(登录次数) UseDNS no   默认是yes 的,把这个改为no,可以大大减 ...

  7. Linux "bring up eth0 failed, eth0 seems not be presernt" 问题解决方案

    =========1.问题========== 重启网卡的时候出现"bring up eth0 failed, eth0 seems not be presernt", 提示找不到 ...

  8. iOS - 使用WKWebView时OC调JS的user-select属性控制用户操作

    // 页面加载完成之后调用 - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigatio ...

  9. ABP之项目的搭建

    ABP是一个非常优秀的框架,使用模块化的管理方式,将当前比较优秀的技术集成到了这个框架中,方便开发者快速搭建自己的网站.作为ABP学习的第一篇,先将ABP框架跑起来看看再说. 1.首先需要去官网下载相 ...

  10. ubuntu16.04下安装artoolkit5

    目前对AR技术的常见理解就是CV(Computer Vision)+CG(Computer Graphic).CV的方法很多,简单些比如FREAK+ICP(ARToolKit中的NFT),复杂些就是S ...