A1067 Sort with Swap(0, i) (25 分| 贪心,附详细注释,逻辑分析)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_24452475/article/details/100568194

写在前面

  • 思路分析
    • 正确理解题意
    • 伪代码实现
      while(left>0) {
          if(0在本号位) {
              找到1个不在本位上的数,令其与0交换;
              交换次数加1;
          }
          while(0不在本号位) {0所在位置的数与0交换;
              交换次数++;
              left--;
          }
      }
      

在这里插入图片描述

  • 新知识点,学习ing

测试用例

  • input:
    10
    3 5 7 2 6 4 9 0 8 1
    output:
    9
    
    input:
    5
    1 2 3 4 0
    output:
    4
    

ac代码

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

学习代码

  • #include <iostream>
    using namespace std;
    
    int main()
    {
    
        int n, t, cnt = 0, a[100010];
        cin >> n;
        for(int i=0; i<n; i++)
        {
            scanf("%d", &t);
            a[t] = i;
        }
    
        for(int i=1; i<n; i++)
        {
            if(i!=a[i])
            {
                while(a[0] != 0)
                {
                    swap(a[0], a[a[0]]);
                    cnt++;
                }
    
                if(1 != a[i])
                {
                    swap(a[0], a[i]);
                    cnt++;
                }
            }
        }
        cout << cnt;
    
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/qq_24452475/article/details/100568194