呃,数学竟然成了我的弱项,还是我小学奥数没学明白呢……

很简单的题目,题意我就不说了

为了完成反向交换,最少的办法就是从一点把所有人分成两组

然后每个组进行反向交换,最后加起来就是

如果某一点需要交换到距离自己的距离超过n/2时,那就可以放到另外一组,得到的交换步骤肯定比较少

不知道说清楚了没有……

代码在别人那里看到的,最开始自己做的递推公式错了……

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int d(int n)//懂得原理,就是一个算数
 5 {
 6  int i,t=0;
 7  for(i=1;i<n;i++)
 8     t+=i;
 9  return t;
10 }
11 
12 int main()
13 {
14  int n,i,a,p;
15  while(cin>>n)
16  {
17   for(i=0;i<n;i++)
18   {
19    cin>>a;
20    p=d(a/2)+d(a-a/2);//算式
21    cout<<p<<endl;
22   }
23  }
24  return 0;
25 }