zoukankan      html  css  js  c++  java
  • HD1394 Minimum Inversion Number

    这道题目的意思是:给你一个序列,统计一开始的逆序数的个数,然后依次把第一个元素放到序列末尾,求每次的逆序数个数,求出每次求逆序数里,逆序数最小的那个数

    这里需要推一个递推式,就是每次你把第一个元素放到末尾后,逆序数个数是怎么改变的  

      假如第一次求出的逆序数为 a,则下次逆序数个数为 a = a + n - 2 * arr[i] - 1;我是简单的验证别人的结论。。。大家可以试着推下

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 const int MAXN = 1e5 + 10;
     8 
     9 int main()
    10 {
    11     int n;
    12     int i, j;
    13     int arr[MAXN];
    14     while(cin >> n)
    15     {
    16         int sum = 0;
    17         for(i = 0; i < n; ++i)
    18         {
    19             for(cin >> arr[i], j = 0; j < i; ++j )
    20             {
    21                 if(arr[i] < arr[j])
    22                     sum++;
    23             }
    24         }
    25 
    26         int minn = sum;
    27         for(i = 0; i < n; ++i)
    28         {
    29             if(minn > (sum = sum+n - 2*arr[i] - 1))
    30             {
    31                 minn = sum;
    32                 //cout << minn << endl;
    33             }
    34         }
    35         cout << minn << endl;
    36     }
    37     return 0;
    38 }
    View Code

    还可以通过树状数组、线段树、归并排序求逆序数(这道题暴力就能过)

  • 相关阅读:
    struts2类型转换2
    list集合排序3
    list集合排序2
    list集合排序
    JSON
    Java获取文件Content-Type(Mime-Type)
    struts2文件下载
    获取文件大小
    struts2国际化
    人人都是产品经理
  • 原文地址:https://www.cnblogs.com/ya-cpp/p/4104396.html
Copyright © 2011-2022 走看看