A1067 Sort with Swap(0, i) (25 point(s))

Swap(0, i)

1. 原文

原题

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:

1
2
3
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:

1
2
10
3 5 7 2 6 4 9 0 8 1

Sample output:

1
9

2. 解析

交换swap(0,i)

  • 先确定a[0]=0; while(a[0]!=0)
  • 再交换swap(0,i) if (a[i]!=i)

3. AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100010]={};
int main()
{
int n;
scanf("%d",&n);
int num;
for (int i = 0; i < n; ++i)
{
scanf("%d",&num);
a[num]=i;
}
int ans=0;
for (int i = 0; i < n; ++i)
{
if (a[i]!=i)
{
while(a[0]!=0){
swap(a[0],a[a[0]]);
ans++;
}
if (a[i]!=i)
{
swap(a[0],a[i]);
ans++;
}
}
}
printf("%d\n", ans);
return 0;
}
本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2019/09/03/A1067/
  • 发布时间: 2019-09-03 12:32
  • 更新时间: 2021-10-29 14:03
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!