zoukankan      html  css  js  c++  java
  • poj 2299 Ultra-QuickSort

    Ultra-QuickSort
    Time Limit: 7000MS   Memory Limit: 65536K
    Total Submissions: 44601   Accepted: 16214

    Description

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence 
    9 1 0 5 4 ,

    Ultra-QuickSort produces the output 
    0 1 4 5 9 .

    Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.

    Input

    The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 -- the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.

    Output

    For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.

    Sample Input

    5
    9
    1
    0
    5
    4
    3
    1
    2
    3
    0
    

    Sample Output

    6
    0
    

    Source

    分析:

    求逆序对,因此利用归并排序,在排序过程中,记录逆序对的数目。

    什么是逆序对

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 #define max 500000
     5 int c[max+5];
     6 int a[max+5];
     7 long long count;
     8 void Merge(int *a,int first,int last){
     9     int p,q,temp,mid;
    10     mid=(first+last)/2;
    11     temp=first;
    12     p=first;
    13     q=mid+1;
    14     while(p<=mid&&q<=last){
    15         if(a[p]>a[q]){
    16             count+=mid+1-p;
    17             c[temp++]=a[q++];
    18         }
    19         else{
    20             c[temp++]=a[p++];    
    21         }
    22     }
    23     while(q<=last){ 
    24             c[temp++]=a[q++];
    25     }
    26     q--;
    27     while(p<=mid){
    28             //count+=q-mid;
    29             c[temp++]=a[p++];
    30     }
    31     int i=first;
    32     for(;i<=last;i++){
    33         a[i]=c[i];
    34     }
    35 }
    36 void MergeSort(int *a,int first,int last){
    37     if(first==last){
    38         return;
    39     }
    40     int mid=(first+last)/2;
    41     MergeSort(a,first,mid);
    42     MergeSort(a,mid+1,last);
    43     Merge(a,first,last);
    44 }
    45 int main(){
    46     int n;
    47     while(scanf("%d",&n)&&n){
    48         count=0;
    49         int i=0;
    50         for(;i<n;i++){
    51              scanf("%d",&a[i]);
    52         }
    53         MergeSort(a,0,n-1);
    54          cout<<count<<endl;
    55     }
    56     //cout<<1<<endl;
    57     return 0;
    58 }
  • 相关阅读:
    MySQL常用函数及逻辑运算
    博客主题2
    TCPIP详解第1卷1.3TCPIP分层1.4互联网的地址1.5域名系统1.6封装
    删除数组中满足特定需求的数字
    自定义简洁浏览器主页
    Matlab图像处理函数:regionprops
    连通域的质心
    Matlab的GUI参数传递方式总结
    retrifit
    association ,collection
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4279953.html
Copyright © 2011-2022 走看看