時間限制: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點在子...