码迷,mamicode.com
首页 > 其他好文 > 详细

Uva 1315 - Creaz tea party ( 数学 + 规律 )

时间:2014-10-09 14:19:13      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   strong   sp   

 

Uva 1315 - Creaz tea party (  数学 + 规律 )

 

题意: 一个环,围在一个坐了N个人。每次操纵可以交换相邻的两个人的位置。求最少需要交换几次,可以变为逆序。

这里的逆序指的是原来在A左边的人在A的右边,在A右边的在A的左边。

 

分析:

如果是线性的,,,果断类似冒牌排序(n)(n-1)/2

但是这里是环,推了推但是推不出结果。。结论是将环分为两段线性的序列,线性的满足上面的公式。

 

如:     1 2 3 4 5 

线性:  5 4 3 2 1  ( 10次 )

环状:  3 2 1 5 4  ( 4次 ) -----------> 相当于 1 2 3做线性 , 4 5 也做线性。。至于为什么从中间开始,不会证明。

 

bubuko.com,布布扣
/* ***********************************************
ID      : whiteblock63
LANG    : G++
PROG    : Uva 1315 - Creaz tea party    
DATE    : 2014-10-08 18:07:47
************************************************ */

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define CLR( a, b )        memset( a, b, sizeof(a) )
using namespace std;
int t, n;

/*
无环情况类似于冒泡排序---耗时为n(n-1)/2
这里有环,有环的情况,
例如 1 2 3 4 5
化为 5 4 3 2 1 ----需要交换10次,并不是最优
化为 3 2 1 5 4 ----需要交换4次,最优
可以想到把 环分解为两条链,自然是中间切开会是最优。注意讨论奇偶就行了。
*/
int main()
{
    scanf( "%d", &t );
    while( t-- )
    {
        scanf( "%d", &n );
        if( n & 1 )
        {
            n = n/2 + 1;
            printf( "%d\n", n*(n-1)/2 + (n-1)*(n-2)/2 );
        }
        else
        {
            n /= 2;
            printf( "%d\n", n*(n-1));
        }

    }

    return 0;
}
代码君

 

Uva 1315 - Creaz tea party ( 数学 + 规律 )

标签:style   blog   http   color   io   os   ar   strong   sp   

原文地址:http://www.cnblogs.com/BigBallon/p/4012317.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!