• 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

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

  • 相关阅读:
    nginx升级步骤
    对一些信息进行正则校验
    对list对象进行排序
    文件上传实现ajax假异步
    解决springmvc+fastjson返回页面出现乱码问题
    php opcode缓存
    node.js 抓取
    mysql 好文章
    rabbitmq 安装
    配置安装nginx
  • 原文地址:https://www.cnblogs.com/ya-cpp/p/4104396.html
Copyright © 2020-2023  润新知