PAT 甲级 A1067 (2019/02/20)

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 100010;
int a[MAXN];        //存放各个数字当前所处的位置编号 
int main(){
    int n, num, ans = 0;//表示总计交换次数 
    scanf("%d", &n);
    int surplus = n - 1;//存放除0以外不在本位上的数的个数 
    for(int i = 0; i < n; i++){
        scanf("%d", &num);
        a[num] = i;  //num所处的位置为i 
        if(num == i && num != 0)//除了零,在本位上的数 
            surplus--;
    }
    int k = 1;      //k存放除了0以外当前不在本位上的最小的数 
    while(surplus > 0) {//只要有数还不在本位上 
        //如果0在本位上,则寻找一个当前不在本位上的数与0交换 
        if(a[0] == 0) {     
            while(k < n) {
                if(a[k] != k) { //找到一个当前不在本位上的数k 
                    swap(a[0], a[k]);       //k与0交换位置 
                    ans++;      //交换次数加1 
                    break;      //退出循环 
                }
                k++;            //判断k+1是否在本位 
            }
        }
        //只要0不在本位,就将0所在位置的数的当前所处位置与0交换 
        while(a[0] != 0) {
            swap(a[0], a[a[0]]);    //0与a[0]交换 
            ans++;          //交换次数加1
            surplus--;      //不在本位上的数的个数减1 
        }
    }
    printf("%d", ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zjsaipplp/p/10425233.html