zoukankan      html  css  js  c++  java
  • 1394-Minimum Inversion Number

    Minimum Inversion Number

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 20162    Accepted Submission(s): 12110


    Problem Description
    The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj.

    For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:

    a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
    a2, a3, ..., an, a1 (where m = 1)
    a3, a4, ..., an, a1, a2 (where m = 2)
    ...
    an, a1, a2, ..., an-1 (where m = n-1)

    You are asked to write a program to find the minimum inversion number out of the above sequences.
     
    Input
    The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the n integers from 0 to n-1.
     
    Output
    For each case, output the minimum inversion number on a single line.
     
    Sample Input
    10 1 3 6 9 0 8 5 7 4 2
     
    Sample Output
    16
     
    Author
    CHEN, Gaoli
    逆序数的概念:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那末它们就称为一个逆序。
    一个排列中逆序的总数就称为这个排列的逆序数。
    思路:先暴力求出开始时的逆序数,然后会有一个性质:每次把末尾的数掉到序列前面时,减少的逆序对数为n-1-a[i] ,增加的逆序对数为a[i] ,所以求出其他情况时的逆序数。
     1 #include<cstdio>
     2 
     3 int t[5010];
     4 int n,ans,sum;
     5 int main()
     6 {
     7     while (scanf("%d",&n)!=EOF)
     8     {
     9         sum = 0;
    10         for (int i=1; i<=n; ++i)
    11             scanf("%d",&t[i]);
    12         for (int i=1; i<n; ++i)
    13             for (int j=i+1; j<=n; ++j)
    14                 if (t[i]>t[j]) sum++;
    15         ans = sum;
    16         for (int i=n; i>=1; --i)
    17         {
    18             sum -= n-1-t[i];
    19             sum += t[i];
    20             if (sum < ans) ans = sum;
    21         }
    22         printf("%d
    ",ans);
    23     }
    24     return 0;
    25 }
  • 相关阅读:
    51nod乘积之和
    Dell服务器安装OpenManage(OMSA)
    Nginx反向代理PHP
    搭建haproxy
    108. Convert Sorted Array to Binary Search Tree
    60. Permutation Sequence
    142. Linked List Cycle II
    129. Sum Root to Leaf Numbers
    118. Pascal's Triangle
    26. Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7053485.html
Copyright © 2011-2022 走看看