洛谷 P1120 小木棍 資料加強版

2021-08-31 01:42:27 字數 937 閱讀 4651

題目:小木棍

思路:搜尋+剪枝。

外層迭代加深,列舉最小長度,用dfs判斷。

dfs維護3個變數x,y,lst,即用了x根木棍,當前拼到了y,上一根木棍的長度為lst。

然後列舉拼接的木棍就好。

剪枝一:從大到小排序。

剪枝二:如果y不為0,那麼列舉的木棍長不要大於lst,不然就會重複搜尋。

剪枝三:如果y==0且列舉的當前木棍不可行那麼就不用再往後列舉。

剪枝四:如果 y+當前木棍長 == 列舉的mid ,且當前木棍不可行,可直接return false。

剪枝五:相同長度的木棍在同一層只用考慮一根就好。

**:

#pragma gcc optimize(2)

#include

using

namespace std;

#define maxn 65

#define read(x) scanf("%d",&x)

int n,m;

int a[maxn+5]

;int mid;

bool use[maxn+5]

;bool

dfs(

int x,

int y,

int lst)

return

false;}

bool

cmp(

const

int& x,

const

int& y)

intmain()

sort

(a+1

,a+n+

1,cmp)

;for

(mid=a[1]

;mid<=m;mid++

)printf

("%d"

,mid)

;return0;

}

洛谷 P1120 小木棍 資料加強版

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過5050。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。搜尋加剪枝 剪枝 1 使用桶排,因為長度不超過50。2 列舉的長度應該能...

洛谷P1120 小木棍 資料加強版

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。共二行。第一行為乙個單獨的整數n表示砍過以後的小木棍的總數,其中n 65 管...

洛谷p1120小木棍 資料加強版 c

dfs剪枝 主要難點在於如何進行dfs的剪枝,典型例題如小木棍 洛谷p1120小木棍 可以二分答案 不二分也不會超時,我的 沒有二分 dfs看看這個答案可不可行 雖然資料很小,直接dfs也是會超時的,所以需要加入一些剪枝。1.從max 最大木棍長度,總木棍長度 要分的段數 為左面,所有木棍長度為右面...