列表

详情


NC207078. 交换

描述

牛客幼儿园的小朋友课间操时间需要按照学号从小到大排队,但是他们太小了只能站成一列顺序却不对,现在幼儿园的阿姨需要帮忙交换小朋友的位置让他们最终有序,阿姨希望能尽快完成交换操作,问最少需要交换多少次,才能使得小朋友们从小到大排好。
注意:每个小朋友的学号不同,但是未必连续,因为可能有小朋友请假了没有来。

输入描述

第一行一个整数 N。
接下来 N 行每行一个整数,为小朋友们的队列。

输出描述

一个整数表示小朋友们的最小交换次数。

示例1

输入:

3
2
1
3

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 43ms, 内存消耗: 2016K, 提交时间: 2020-05-29 22:10:00

#include <bits/stdc++.h>
using namespace std;
#define maxn 100001
int n,ans,a[maxn],b[maxn];
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d",&a[i]),b[i]=a[i];
	sort(b,b+n);
	for(int i=0;i<n;i++){
		if(a[i]!=b[i]) swap(a[i],a[lower_bound(b,b+n,a[i])-b]),ans++,i--;
	}
	printf("%d",ans);
	return 0;
}

Python3 解法, 执行用时: 318ms, 内存消耗: 19044K, 提交时间: 2023-03-12 12:12:07

N = int(input())
l = [int(input()) for i in range(N)]
d = {b:a for a,b in enumerate(l)}
m = sorted(l)
result = 0
for i in range(len(l)-1):
    if l[i] != m[i]:
        j = d[m[i]]
        l[i],l[j] = l[j],l[i]
        d[l[i]],d[l[j]] = d[l[j]],d[l[i]]
        result += 1
print(result)

上一题