/* coder: ACboy date: 2010-2-27 result: AC description: UVa 299 Train Swapping */ #include <iostream> using namespace std; // 用来保存输入的初始排列 int data[100]; // 用于标记数据是否被排序过 int vis[100]; int N, L; int main() { int i, j; #ifndef ONLINE_JUDGE freopen("299.txt", "r", stdin); #endif cin >> N; while (N--) { cin >> L; for (i = 0; i < L; i++) { cin >> data[i]; } // 初始化都没被排序过 memset(vis, 0, sizeof(vis)); // 保存答案 int ans = 0; for (i = 0; i < L; i++) { int min = 100; int position = -1; // 每次都找出没有被排序过的数据的最小值,并保存它的位置(position) for (j = 0; j < L; j++) if (!vis[data[j]] && data[j] < min) { min = data[j]; position = j; } // 标记该元素被排序过 vis[data[position]] = 1; // 模拟数据交换过程 for (j = position; j >= 1; j--) { if (data[j - 1] > data[j]) { ans++; int temp = data[j - 1]; data[j - 1] = data[j]; data[j] = temp; } else break; } } cout << "Optimal train swapping takes " << ans << " swaps." << endl; } return 0; }