2016 I 交换瓶子
有N个瓶子,编号 1 ~ N,放在架子上。
比如有5个瓶子:2 1 3 5 4,要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
比如有5个瓶子:2 1 3 5 4,要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
输入
输入存在多组测试数据,对于每组测试数据:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。
第一行: 一个正整数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; }