HDU 1214 圓桌會議

來源:互聯網
上載者:User

這題糾結了很長時間,主要是題目看不太明白!

剛開始一直在想暴利解決。讓程式自動去調換,記錄次數!汗顏!!!

言歸正傳。這題就是在求一串數在每次只能對調相鄰兩位時,要得到其逆序最少要移動多少次。

在直線上移動很簡單,類似於冒泡排序的方法,一個數不斷向上冒,直到最終位置。不難得到其需要移動的次數公式為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要求整數。

AC代碼:

#include<iostream>using namespace std;int main(){int n,a,b;while(cin>>n){a=n/2;b=n-a;cout<<a*(a-1)/2+b*(b-1)/2<<endl;}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.