BOJ1131 Crazy tea party 冒泡排序变形

题意:给一行数字,只能相邻的两个交换位置。为交换多少次之后能使得这行数字里的每个数的左右数字交换。(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;
}


你可能感兴趣的:(table)