专栏文章

题解:P12176 [蓝桥杯 2025 省 Python B] 书架还原

P12176题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipei663
此快照首次捕获于
2025/12/03 10:41
3 个月前
此快照最后确认于
2025/12/03 10:41
3 个月前
查看原文
这题主要的思想是贪心,与图论关系不大。

题目大意:

给你一个由 11nn 组成的序列,保证这 nn 个数各不相同。请你求出将其从小到大排序的最少交换次数。

算法分析:

先看数据范围, nn 的最大值是 10610^6,暴力不可取。
考虑将无序数列中,每本书的下标记录下来,再 O(N)O(N) 扫一遍,找到放错的那些书。若第 ii 本书放错位了,则将其应该在的位置上的书与其交换。
思路明确后,代码很简短。

AC Code:

CPP
#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],b[1000005],ans;
int main(){
	scanf("%d",&n);//书架上有n本书。
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);//第i个位置上的书的编号。
		b[a[i]]=i;//记录其下标。
	}for(int i=1;i<=n;i++){
		if(b[i]!=i){//如果第i本书放错了,则需要调换一次。
			b[a[i]]=b[i];
			swap(a[b[i]],a[i]);
			ans++;
		}
	}
	printf("%d",ans);//输出最小交换次数。
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...