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

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

posted @ 2014-11-17 21:09  unicoe  阅读(153)  评论(0编辑  收藏  举报