Hdu 1214 圓桌會議

圓桌會議

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


ios

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
 
 
解題報告(數學題):
根據題意要求,須要將圓桌的隊員順序倒過來。首先,我想到的是直接冒泡排序將1-n逆序求出所需的步驟便可,但是結果卻和給出的答案不同。後來想了想,全部的人圍成了一個圓,能夠將圓分紅兩段,例如n=6時,將1到3逆序以後爲三、二、1,而後將4到6逆序以後爲六、五、4,這樣最後圍成一個圓後是三、二、一、六、五、4,知足要求。因此要使最後的時間最少,只需將n分紅最接近的兩段,用冒泡法將順序逆序便可。(注:冒泡排序的算法複雜度爲:n*(n-1)/2 )
 
 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n, n1, n2, sum;
 8     while (scanf("%d",&n) != EOF)
 9     {
10         sum = 0;
11         if(n%2 == 0)
12         {
13             n1 = n/2;
14             n2 = n/2;
15         }
16         else
17         {    
18             n1 = n/2;
19             n2 = n-n1;
20         }
21         sum = n1*(n1-1)/2 + n2*(n2-1)/2;
22         printf("%d\n",sum);
23     }
24     return 0;
25 }
View Code
相關文章
相關標籤/搜索