2016 I 交换瓶子

有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
#include <bits/stdc++.h>
using namespace std;
int n;
int a[10010];
int main(){
    ios::sync_with_stdio(0);
    while(cin >> n){
        int ans = 0;
        for(int i = 1; i <= n; i++)
            cin >> a[i];
        for(int i = 1; i <= n; i++){
            while(i != a[i]){
                //a[i]的位置不对,要找一个对的位置
                //a[i]放在a[a[i]],一直找到合适的位置
                swap(a[i],a[a[i]]);
                ans++;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

 

 
posted @ 2020-04-16 15:43  Hazelxcf  阅读(135)  评论(0编辑  收藏  举报