2824 AHOI2012 鐵盤整理

2021-07-27 22:13:14 字數 1286 閱讀 8188

time limit: 10 sec  memory limit: 128 mb

submit: 377  solved: 202 [

submit][

status][

discuss]

在訓練中,一些臂力訓練器材是少不了的,小龍在練習的時候發現舉重器械上的鐵盤放置的非常混亂,並沒有按照從輕到重的順序擺放,這樣非常不利於循序漸進的鍛鍊。他打算利用乙個非常省力氣的辦法來整理這些鐵盤,即每次都拿起最上面的若干個圓盤並利用器械的力量上下翻轉,這樣翻轉若干次以後,鐵盤將會按照從小到大的順序排列好。那麼你能不能幫小龍確定,最少翻轉幾次就可以使鐵盤按從小到大排序呢?

例如:下面的鐵盤經過如圖2.1所示的以下幾個步驟的翻轉後變為從小到大排列。

共兩行,第一行為鐵盤個數n(1≤n≤50)。第二行為n個不同的正整數(中間用空格分開),分別為從上到下的鐵盤的半徑   r(1≤r≤100)

乙個正整數,表示使鐵盤按從小到大有序需要的最少翻轉次數。

5 2 4 3 5 15

[ submit][

status][

discuss]

很顯然是個大力搜尋,每次列舉該翻到**

這樣的翻轉有乙個顯然的性質,可以通過每兩次操作將當前最上面的鐵盤歸為

只要先把這個鐵盤翻到它應該在的位置上,再把其它鐵盤翻回去,這樣其它鐵盤的位置都不受影響

因此,答案有個明顯的上界為2*n

對於鐵盤序列,統計當前狀態下不應該相鄰的鐵盤有多少對,設為k

則至少需要k次翻轉才能讓所有鐵盤歸為,因為一次翻轉最多增加一對應該相鄰的鐵盤

用這個優化搜尋過程就行了

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int n = 55;

int n,ans,a[n],b[n];

bool g[101][101];

void swap(int k)

void dfs(int now,int tot)

if (pass)

for (int i = 2; i <= n; i++)

} int main()

bzoj2824 AHOI2012 鐵盤整理

自己去看。還有呢看了下路牌,居然是dfs 剪枝tat 然後我就敲了乙個然後t了。大概是長這樣。也算。加了剪枝吧。include include include include include using namespace std const int n 55 int n int a n int b...

AHOI2012 樹屋階梯

卡特蘭數!至於為什麼是卡特蘭數,就稍微說那麼一兩句吧 對於乙個高度為 i 的階梯,我們可以在左上角填乙個高度為 k 的階梯,右下角填乙個高度為 i 1 k 的階梯剩下的我們用乙個大的長方形填上就可以啦 比如這個樣子 之後還需要高精,但是為了簡單好寫,這裡可以分解質因數,之後就變成另乙個單精度乘高精了...

AHOI2012 樹屋階梯

有無窮多的任意尺寸矩形,搭建乙個 n 級正階梯有多少種方案?任意大小為 i 的階梯,都可以由左上角放一塊大小為 j 的,右下角放一塊大小為 i j 1 的來構成,每一塊內部遞迴填充,對應 catalan 數 實現需要高精乘單精,高精除單精 include using namespace std co...