BOJ1131 Crazy tea party 冒泡排序变形

来源:互联网 发布:mac收藏网页怎么删除 编辑:程序博客网 时间:2024/05/13 20:57

题意:给一行数字,只能相邻的两个交换位置。为交换多少次之后能使得这行数字里的每个数的左右数字交换。(reverse)。

注意!这行数是不是在一行里,是around the table ,即是一个环。

思路:如果这个不是环的话,很显然,就是冒泡排序。1 2 3 4 5冒泡排序成5 4 3 2 1 交换次数是n*(n-1)/2。

但是关键点也是蛋疼点就是这个是环:当时做的时候是写了不少数组都算看看,猜出蹊跷点。

这里让我想到我一个获得过acm区域赛的金奖老乡给我说有次参加某校赛的时候,

本来是没戏了,但是在最后一个小时的时候,猜了三道题的解法,都是自己设定出一些数组来猜想。

没想到三道题都ac了。一下次就名次上升到第二。


其实有环和没环的区别在于,比如123 只要交换一次成213,就可以。如果是12345,即交换到321 54 (次数4),但是交换到4321  5(次数6)这样次数不是最小。

原因很显然n*(n-1)/2是n的平方增长。

因为环的原因我们可以使之截成两段,很显然是均匀截成两段使之总次数是最小。



#include<iostream>#include<math.h>using namespace std;const int N=105;int n;int main(){        int cases;    scanf("%d",&cases);    while(cases--)    {        scanf("%d",&n);        if(!(n%2))        {            printf("%d\n",(n/2)*(n/2-1));        }        else            printf("%d\n",(n/2)*(n/2 -1)/2 + (n/2 +1)*(n/2)/2);    }    return 0;}