专栏文章
题解:P12176 [蓝桥杯 2025 省 Python B] 书架还原
P12176题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipl77ay
- 此快照首次捕获于
- 2025/12/03 13:49 3 个月前
- 此快照最后确认于
- 2025/12/03 13:49 3 个月前
CPP
#include <iostream>
#include <vector>
using namespace std;
int minSwaps(vector<int>& books) {
int n = books.size();
vector<bool> visited(n, false);
int swaps = 0;
for (int i = 0; i < n; ++i) {
if (!visited[i] && books[i] != i + 1) {
int cycle_size = 0;
int j = i;
while (!visited[j]) {
visited[j] = true;
j = books[j] - 1;
cycle_size++;
}
if (cycle_size > 0) {
swaps += (cycle_size - 1);
}
}
}
return swaps;
}
int main() {
int n;
cin >> n;
vector<int> books(n);
for (int i = 0; i < n; ++i) {
cin >> books[i];
}
cout << minSwaps(books) << endl;
return 0;
}
代码解释
输入处理:
读取书的数量 n 和当前排列顺序 books。
标记数组:
visited 数组用于标记已经处理过的元素,避免重复计算。
环检测:
遍历数组,对于每个未被访问且不在正确位置的元素,追踪其所在的环。环的大小决定了需要交换的次数。
交换次数计算:
每个环需要 环长度 - 1 次交换,累加所有环的交换次数得到最终结果68。
这种方法高效且直观,确保以最少的交换次数恢复书的正确顺序。
so easy
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...