HDU 1214 圓桌會議

                    圓桌會議

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1914    Accepted Submission(s): 1319


Problem Description
HDU ACM集訓隊的隊員在暑假集訓時經常要討論自己在做題中遇到的問題.每當面臨自己解決不了的問題時,他們就會圍坐在一張圓形的桌子旁進行交流,經過大家的討論後一般沒有解決不了的問題,這也只有HDU ACM集訓隊特有的圓桌會議,有一天你也可以進來體會一下哦:),在一天在討論的時候,Eddy想出了一個極爲古怪的想法,如果他們在每一分鐘內,一對相鄰的兩個ACM隊員交換一下位子,那麼要多少時間才能得到與原始狀態相反的座位順序呢?(即對於每個隊員,原先在他左面的隊員後來在他右面,原先在他右面的隊員在他左面),這當然難不倒其他的聰明的其他隊友們,馬上就把這個古怪的問題給解決了,你知道是怎麼解決的嗎?
 

 

Input
對於給定數目N(1<=N<=32767),表示有N個人,求要多少時間才能得到與原始狀態相反的座位順序(reverse)即對於每個人,原先在他左面的人後來在他右面,原先在他右面的人在他左面。
 

 

Output
對每個數據輸出一行,表示需要的時間(以分鐘爲單位)
 

 

Sample Input
4 5 6
 

 

Sample Output
2 4 6
將所有逆向排序,在直線上移動很簡單,一個數不斷向上冒,直到最終位置。不難得到其需要移動的次數公式爲n*(n-1)/2。其中n爲總點數。

設n爲總長度,分爲兩段,長度分別爲a、b。總次數=a*(a-1)/2+b*(b-1)/2=a*(a-1)/2+(n-a)*(n-a-1)/2=(2*a^2-2*n*a+n^2)/2。

其中n爲常量,a爲變量。二次曲線開口向上,最小值對應的a=-(-2*n)/(2*2)=n/2。顯然a要求整數

#include<stdio.h>
int main()
{
    int n,a;
    while(~scanf("%d",&n))
    {
        a=n/2;
        n-=a;
        printf("%d\n",a*(a-1)/2+n*(n-1)/2);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章