码迷,mamicode.com
首页 > 其他好文 > 详细

PAT 甲级 A1067 (2019/02/20)

时间:2019-02-24 10:33:57      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:--   max   names   次数   i++   最小   swap   c++   break   

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

PAT 甲级 A1067 (2019/02/20)

标签:--   max   names   次数   i++   最小   swap   c++   break   

原文地址:https://www.cnblogs.com/zjsaipplp/p/10425233.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!