藍橋杯2016初賽 - 交換瓶子 - 暴力/思維
阿新 • • 發佈:2020-10-13
題面
有N個瓶子,編號 1 ~ N,放在架子上。比如有5個瓶子:2 1 3 5 4,要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為:1 2 3 4 5。對
於這麼簡單的情況,顯然,至少需要交換2次就可以復位。
輸入存在多組測試資料,對於每組測試資料:
第一行: 一個正整數N(N<10000), 表示瓶子的數目
第二行:N個正整數,用空格分開,表示瓶子目前的排列情況。
輸出:
對於每組測試資料輸出一行,包含一個正整數表示答案。
樣例輸入
5
3 1 2 5 4
5
5 4 3 2 1
樣例輸出:
3
2
多補一組資料:
5
2 3 4 1 5
3
我的錯誤程式碼沒有測其他資料。……
思路
大家都說是水題,但是我第一遍就WA了,……
這個題之前應該做過,而且這題還是直接暴力的,我還……
不需要排序,不需要開其他b、c等陣列,直接for迴圈從1到n開始遍歷,找到和a[i]不相等的,就去交換,被交換的那個資料就是a[a[i]]。
以此類推計算個數。
AC程式碼
#include<iostream> #include<stdio.h> #include<cmath> #include<algorithm> #include<queue> #include<map> #include<stack> #include<vector> #include<string.h> using namespace std; #define inf 0x3f3f3f3f int a[10010]; int main() { int n; while (cin >> n) { for (int i = 1; i <= n; i++) cin >> a[i]; int w = 0; for(int i = 1; i <= n; i++) { while (a[i] != i) { swap(a[i], a[a[i]]); w++; } } cout << w << endl; } return 0; }
錯誤程式碼
#include<iostream> #include<stdio.h> #include<cmath> #include<algorithm> #include<queue> #include<map> #include<stack> #include<vector> #include<string.h> using namespace std; #define inf 0x3f3f3f3f int a[10010],b[10010]; int main() { int n; while (cin >> n) { for (int i = 0; i < n; i++) cin >> a[i],b[i]=a[i]; sort(b, b + n); int cnt = 0; for (int i = 0; i < n; i++) { if (a[i] != b[i]) cnt++; } if (cnt % 2 == 1) cout << cnt / 2 + 1 << endl; else cout << cnt / 2 << endl; } return 0; }