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

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

你可能感兴趣的:(version)