纠结了半天读不懂题目是啥意思
交换策略不明白
后来想了下,题意应该是每次只交换一队人
那么吧圆看成两端弧线,则只需让两段弧线都逆转即可
对于一个有n个点的线段,让所有点逆序最少需要n*(n-1)/2次交换(参考冒泡排序)
那么拆分成多长的线段合适呢?尽量让两段长度相同
设总长为L,a+b=L,求a*(a-1)/2+b*(b-1)/2的最小值,代入下即可证明上述结论
代码如下:
#include <stdio.h>
int main(void) {
int a, n;
while(scanf("%d", &n) != EOF) {
a = n/2;
n -= a;
printf("%d\n", a*(a-1)/2+n*(n-1)/2);
}
}