• PAT 1067. Sort with Swap(0,*)


    1067. Sort with Swap(0,*) (25)

     

    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

    一开始按照选择排序做了, 结果有两个测试点超时, 看看网上的思路基本上都是判断是否被访问的算法,想了想这个应该是表排序的变形,就按照表排序方式做了,花了一下午调试 果然AC了, 特地来交流 ^_^!

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef int ElementType;
     5 
     6 void Swap(ElementType *a, ElementType *b);
     7 void PrintA(ElementType A[], int N);
     8 int IsSort( ElementType A[], int m, int N);
     9 void SwapZero( ElementType A[], ElementType B[], int N);
    10 
    11 typedef struct {
    12     int index;//0元素所在下标
    13     int count;//记录交换次数
    14 }Zero;
    15 
    16 Zero zero;
    17 
    18 int main(){
    19     int N, i;
    20     zero.count = 0;
    21     //freopen("C:\in.txt","r", stdin);
    22     scanf("%d", &N);
    23     ElementType* A;//这个是原来的数组
    24     A = (ElementType*)malloc(N*sizeof(ElementType));
    25     ElementType* B;//这个是表
    26     B = (ElementType*)malloc(N*sizeof(ElementType));
    27     for( i=0; i<N; i++){
    28         scanf("%d", &A[i]);
    29         B[A[i]] = i;//记录A[i]所在的位置 
    30         if(A[i] == 0) 
    31             zero.index = i;
    32     }
    33     SwapZero(A, B, N);
    34     printf("%d
    ", zero.count);
    35     return 0;
    36 }
    37 
    38 int IsSort( ElementType A[], int m, int N){
    39     int i;
    40     int flag = 0;
    41     for(; m<N; m++ ){
    42         if( m != A[m] ) {
    43             flag = m;
    44             break;
    45         }
    46     }
    47     return flag;
    48 }
    49 
    50 void SwapZero( ElementType A[], ElementType B[], int N){
    51     int i, m = 1;
    52     for( ; ; ){
    53         if( zero.index != 0 ){//交换swap(0,i);
    54             Swap( &A[zero.index], &A[B[zero.index]]);
    55             B[0] = B[zero.index];
    56             B[A[zero.index]] = zero.index;//更新表
    57             zero.index = B[0];
    58             zero.count++;
    59         } else if( m=IsSort(A, m, N)){  //找到第一个位置不对的数字交换
    60             Swap( &A[zero.index], &A[m]);//交换,更新表
    61             B[zero.index] = m;
    62             B[A[zero.index]] = 0;
    63             zero.index = B[zero.index];
    64             zero.count++;
    65         } else break;
    66     }
    67 }
    68 
    69 
    70 void Swap(ElementType *a, ElementType *b){
    71     int tmp;
    72      tmp = *a;
    73      *a = *b;
    74      *b = tmp;
    75 }
  • 相关阅读:
    IIS 之 未能加载文件或程序集“IBM.Data.DB2”或它的某一个依赖项。试图加载格式不正确的程序。
    WebService 之 身份验证
    MVC 之 属性详解
    绕过Web授权和认证之篡改HTTP请求
    跨站点脚本编制-XSS 描述及解决方法
    CSRF(跨站请求伪造攻击)漏洞详解
    HTTP.SYS 远程执行代码漏洞分析(MS15-034 )
    Socket 之 传值方式
    GET 和 POST的区别
    Gdb调试多进程程序
  • 原文地址:https://www.cnblogs.com/xuningfans/p/4962038.html
Copyright © 2020-2023  润新知