呃,数学竟然成了我的弱项,还是我小学奥数没学明白呢……
很简单的题目,题意我就不说了
为了完成反向交换,最少的办法就是从一点把所有人分成两组
然后每个组进行反向交换,最后加起来就是
如果某一点需要交换到距离自己的距离超过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 }