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...