牛客 小木棍(DFS 搜尋剪枝)

2022-05-26 19:00:11 字數 1490 閱讀 4352

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。

第一行為乙個單獨的整數n表示砍過以後的小木棍的總數。第二行為n個用空格隔開的正整數,表示n根小木棍的長度。

輸出僅一行,表示要求的原始木棍的最小可能長度。

示例1輸入

95 2 1 5 2 1 5 2 1

輸出

6備註:

1<=n<=60

題目大意:

給出n個小木棍,你的任務是把他們拼接起來,還原原來的木棍,求拼接後每個小木棍的最小長度。

解題思路:

這個題注意一定要用搜尋做而不是二分,之前做過乙個拆分木棍的題是二分,因為那個題長度和拆分的數量有乙個線性關係,而這個合併木棍並沒有,我們用dfs+剪枝ac這個題,因為要求最小的長度,我們先將木棍排序,因為要求拼成的最小的長度,我們要從這些木棍最長的開始往上列舉,對每乙個列舉的長度進行搜尋,搜尋的狀態是(剩餘木棍的個數,列舉的長度,當前拼成木棍剩餘長度,和當前列舉的哪一根木棍)另外需要剪枝操作,剪枝有以下幾點:

如果當前木棍是當去拼列舉長度的第一根,則需要剪掉,因為我們從最長的開始列舉,如果連第乙個都拼不上,那麼後面的肯定也拼不上。

如果當前木棍是當去拼列舉長度的最後一根,也需要剪掉,因為木棍是從大到小排,如果這個長度都不行,那後面的長度肯定比這個還小,肯定也拼不上,剪掉。

如果當前小木棍拼不上,那麼和當前木棍長度相同的木棍肯定也拼不上,直接過濾掉和當前木棍長度相等的木棍即可。

ac**:

#include

#include

#include

using

namespace std;

const

int n =65;

int a[n]

,n;bool vis[n]

;bool

cmp(

int a,

int b)

bool

dfs(

int num,

int len,

int rest,

int now)

}return

false;}

intmain()

n-=s;sort

(a,a+n,cmp)

;for

(int i=a[0]

;i<=sum;i++

)//從最大的開始列舉

}return0;

}

小木棍 搜尋剪枝

小木棍,多麼經典的題目啊,幾年都拿出來做一下,今年終於感覺有點明白了 真為中年婦女的智商著急啊 題解抄的luogu題解,修改了以前抄的 終於ac了.主要難點在於如何進行dfs的剪枝可以二分答案 不二分也不會超時,我的 沒有二分 dfs看看這個答案可不可行雖然資料很小,直接dfs也是會超時的,所以需要...

搜尋剪枝DFS

tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...

DFS搜尋 剪枝

hdu 5952 題意 給出一張無向圖,然後判斷這張圖中一共有多少個不同的大小為s的完全圖 完全圖的頂點數為s個 題目保證每個點的度不大於20。完全圖 n個點兩兩之間都有一條邊的圖叫完全圖。思路 由於頂點個數很少,而且每個點的度數最多是20,所以可以暴力優化,建圖,對於每個s點完全子圖,如果i點在子...