题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1214

谈到邻位交换,冒泡排序应该是所有人编程中最先接触到的,如果是一条直线的话,很容易想到时间为n(n-1)/2,但是这个问题中变成了一个圆,我们不能单单的把它当成是一条直线来判断,但是我们可以把它看成是两条直线来判断,那么两条直线的长度又分别是多长呢,这里我们可以证明一下,设其中一段的长度为a,那么总共需要的时间就是a(a-1)/2+(n-a)(n-a-1)/2,很容易看出,当a == n/2的时候答案最小。


#include <cstdio>
#include <cstring>
int main()
{
int n;
while(scanf("%d", &n) !=EOF)
{
int a = n/2;
int b = n-a;
printf("%d\n", a*(a-1)/2 + b*(b-1)/2);
}
}