专栏文章

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

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

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mipk40yz
此快照首次捕获于
2025/12/03 13:18
3 个月前
此快照最后确认于
2025/12/03 13:18
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 n 和当前排列顺序 booksbooks

‌标记数组‌:

visitedvisited 数组用于标记已经处理过的元素,避免重复计算。

‌环检测‌:

遍历数组,对于每个未被访问且不在正确位置的元素,追踪其所在的环。环的大小决定了需要交换的次数。

‌交换次数计算‌:

每个环需要 环长度 1 - 1 次交换,累加所有环的交换次数得到最终结果 68‌68 。 这种方法高效且直观,确保以最少的交换次数恢复书的正确顺序。

~~ so easy~ ~

评论

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

正在加载评论...