PAT——A1067(贪心)

题目链接:

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100010
int pos[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    int left=n-1;
    int num;
    int ans=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&num);
        pos[num]=i;
        if(num==i&&num!=0)
        {
            left--;
        }
    }
        int k=1;
        while(left>0)
        {
            if(pos[0]==0)
            {
                while(k<n)
                {
                    if(pos[k]!=k)
                    {
                        swap(pos[0],pos[k]);
                        ans++;
                        break;
                    }
                    k++;
                }
            }
            while(pos[0]!=0)
            {
                swap(pos[0],pos[pos[0]]);
                ans++;
                left--;
            }
        }
    printf("%d\n",ans);
    return 0;
}

关键就是要考虑到两种情况

一是0在它的位置上,这时就要找出0要变换的位置(减少无效操作,与不在本位置的数进行交换)

而是不在他的位置,这时就要与位置的数进行交换

猜你喜欢

转载自blog.csdn.net/qq_42232118/article/details/81710932