1. 程式人生 > 實用技巧 >藍橋杯2016初賽 - 交換瓶子 - 暴力/思維

藍橋杯2016初賽 - 交換瓶子 - 暴力/思維

題面

有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;
}