• 【PAT(甲级)】1067 Sort with Swap(0, i)(附解题思路)


    Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:

    Swap(0, 1) => {4, 1, 2, 0, 3}
    Swap(0, 3) => {4, 1, 2, 3, 0}
    Swap(0, 4) => {0, 1, 2, 3, 4}

    Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.

    Input Specification:

    Each input file contains one test case, which gives a positive N (≤105) followed by a permutation sequence of {0, 1, ..., N−1}. All the numbers in a line are separated by a space.

    Output Specification:

    For each case, simply print in a line the minimum number of swaps need to sort the given permutation.

    Sample Input:

    10
    3 5 7 2 6 4 9 0 8 1

    Sample Output:

    9

    解题思路:

    题目给出一组已经打乱排序的数组,让你只能交换值为0和其他的数字,使得最终排序为升序,要求输出最少的交换次数。

    1. 首先我们要明确,值为0的数,无论怎么交换,最终都会出现在数组下标为0的位置上。所以我们第一步就是从数组下标为0的位置开始交换,因为是两两交换,每次都会使得至少一个位置上的数字正确,所以肯定能把0放到下标为0的位置上:

    while(number[0]!=0){
                    swap(number[0],number[number[0]]);
                    times++;
                } // 使得number[0]位置上的数字可以出现在正确的位置上

    2. 如果此时,依旧没有使得number[i]位置上的数字正确,那么就将0放到number[i]上,在第二次使0归为的途中,number[i]就一定会出现一个正确的数字了。

    代码:

    1. #include
    2. using namespace std;
    3. int main(){
    4. int N;
    5. cin>>N;
    6. int number[N];
    7. int times = 0;
    8. for(int i=0;i
    9. cin>>number[i];
    10. }
    11. for(int i=1;i
    12. if(number[i] != i){
    13. while(number[0]!=0){
    14. swap(number[0],number[number[0]]);
    15. times++;
    16. }
    17. if(number[i]!=i){
    18. swap(number[0],number[i]);
    19. times++;
    20. }
    21. }
    22. }
    23. cout<
    24. }

  • 相关阅读:
    智慧交通与车载数据的聚合路由器通信方案
    搭建oss服务器时报错:java.lang.NullPointerException
    速卖通:按关键字搜索商品 API
    让软件开发民主化的低代码
    联通面试题
    高性能日志脱敏组件:已支持 log4j2 和 logback 插件
    Qt Socket 通讯示例2
    # Spring MVC与RESTful API:如何设计高效的Web接口
    复习mysql中的事务
    python读取txt格式的点云文件,可视化显示,保存ply格式
  • 原文地址:https://blog.csdn.net/weixin_55202895/article/details/126866128