题目:n个人(逆时针编号)坐成一圈,把他们的顺序倒转(编号顺时针),每次相邻交换,求最少交换次数。
分析:逆序数。公式很简单,推导有点麻烦。
1.首先是关于相邻交换,最小的交换次数就是逆序数(相邻元素交换逆序数最多改变1)
2.根据 1,我们可知本题求救的就是把逆序环拆开后最小的逆序数
我们假设从 k点拆开,则串就是 k,...,1,n,...,k+1;
则它的逆序数 为 k(k-1)/2 + (n-k)*(n-k-1)/2 整理后就可得到;
当 k = n/2 时,式子有最小值(其实不整理也看得出来。。。);
3.结论 Min = L*(L-1)/2 + R*(R-1)/2 { L = n/2, R = n-L }。
说明:又见逆序数。(2011-9-22 01:48)
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int n,m;
while ( cin >> n )
while ( n -- ) {
cin >> m;
int L = m/2;
int R = m-L;
cout << L*(L-1)/2 + R*(R-1)/2 << endl;
}
return 0;
}