这道题目的意思是:给你一个序列,统计一开始的逆序数的个数,然后依次把第一个元素放到序列末尾,求每次的逆序数个数,求出每次求逆序数里,逆序数最小的那个数
这里需要推一个递推式,就是每次你把第一个元素放到末尾后,逆序数个数是怎么改变的
假如第一次求出的逆序数为 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 }
还可以通过树状数组、线段树、归并排序求逆序数(这道题暴力就能过)