专栏文章
题解:P12176 [蓝桥杯 2025 省 Python B] 书架还原
P12176题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipei663
- 此快照首次捕获于
- 2025/12/03 10:41 3 个月前
- 此快照最后确认于
- 2025/12/03 10:41 3 个月前
这题主要的思想是贪心,与图论关系不大。
题目大意:
给你一个由 到 组成的序列,保证这 个数各不相同。请你求出将其从小到大排序的最少交换次数。
算法分析:
先看数据范围, 的最大值是 ,暴力不可取。
考虑将无序数列中,每本书的下标记录下来,再 扫一遍,找到放错的那些书。若第 本书放错位了,则将其应该在的位置上的书与其交换。
思路明确后,代码很简短。
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 条评论,欢迎与作者交流。
正在加载评论...