1. 程式人生 > 其它 >B. Build the Permutation

B. Build the Permutation

 

 

 

題目分析:我們先簡單的分析一下這道題是在幹什麼啊,給我們三個整數n,a,b,問我們能否構造這樣的排列使得序列中有a個極大值,b個極小值,能的話就給出任意一種可能的情況,不能的話就輸出-1;

 

其實一開始我分析這道題的方法不是很好,這道題最好的解決方法不是舉幾個栗子然後觀察規律,而是應該學會數形結合,我們可以發現這其實就是一個數列,我們把每個孤立的點之間連成線就可以得到一個函式影象,a其實就是影象極大值的個數,b就是影象極小值的個數;

如圖:

 

 

 

 

於是我們先來找出答案是-1的情況:

 

我們可以發現兩個相鄰的極小值之間有且只有一個極大值,兩個相鄰的極大值之間也是如此,所以我們可以知道a和b的差值最多為1,不然就會出現兩個極小值之間沒有極大值的情況;

 

然後我們可以看出n的最小值也就是點的個數的最小值是a+b+2,所以我們可以特判處兩個不能構造的情況

                                            if(abs(a - b) > 1 || a + b + 2 > n) cout << -1 << '\n';

 

接下來我們再根據a和b的具體大小來看一看應該怎麼構造:

 

a   >  b時:

 

 

 

a   <   b 時:

 

 

 

a  ==  b時:

 

 

 

 

分析:這道題如果這樣用圖分析了其實不難,比較困難的事我該怎麼用數值去表示具體的每個點,避免有重複或者遺漏!我們要根據a和b的具體數值來套入圖中,然後寫迴圈;

 

程式碼:Submission #153007728 - Codeforces