開啟章節選單
299 Train Swapping
題目連結
題目敘述
在一個老舊的火車站裡,你可能還會遇到最後幾位「列車調度員」。他們的工作就是將火車的車廂按照正確順序重新排列,方便列車司機在各個車站卸下對應的車廂
現在鐵路公司想要自動化這個操作。他們需要一個程式,計算出將一列車廂排列成由小到大順序時,最少需要交換多少次相鄰車廂
輸入說明
- 第一行是一個整數 N,代表有 N 組測試資料
- 每組測試資料包含兩行:
- 第一行是一個整數 L,代表車廂數量(0 ≤ L ≤ 50)
- 第二行有 L 個整數,為 1~L 的一組排列,表示目前車廂的順序
輸出說明
對於每組測試資料,請輸出一行:
Optimal train swapping takes S swaps.
其中 S 為將這組車廂排序成 1 到 L 所需的最少「相鄰兩車廂交換」次數
解題思路
- 題目要求:計算把車廂序列用相鄰交換(Bubble Sort 的 swap 操作),排序為升序(1, 2, ... L)所需的最少交換次數
- 做法:用 氣泡排序(Bubble Sort) 的想法,每次把最大的數字慢慢「冒泡」到右邊,同時計算每次交換的次數即可
- 實作重點:
- 每兩個相鄰的車廂,如果前面的比後面的還大,就交換並把計數器+1
- 外層和內層雙迴圈,直到整個序列完成排序
- 輸出對應的次數即可
程式碼
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int L; cin >> L; vector<int> vc(L); for (int i = 0; i < L; i++) cin >> vc[i]; int cnt = 0; for (int i = 0; i < L; i++) { for (int j = 0; j < L - i - 1; j++) { if (vc[j] > vc[j + 1]) { swap(vc[j], vc[j + 1]); cnt++; } } } cout << "Optimal train swapping takes " << cnt << " swaps." << endl; } return 0; }