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

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

  • 相关阅读:
    11.06第十次作业
    (构造方法私有化、this)10.29练习题
    10.23创造人
    10.16(RuPeng)游戏
    10.09
    作业9.25
    练习题
    (随机数之和)求一整数各位数之和1636050052王智霞
    两点之间的距离1636050052王智霞
    TabLayout 简单使用。
  • 原文地址:https://www.cnblogs.com/ya-cpp/p/4104396.html
Copyright © 2011-2022 走看看