呃,數學竟然成了我的弱項,還是我小學奧數沒學明白呢……

很簡單的題目,題意我就不說了

為了完成反向交換,最少的辦法就是從一點把所有人分成兩組

然后每個組進行反向交換,最后加起來就是

如果某一點需要交換到距離自己的距離超過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 }