洛谷 1120 小木棍(資料加強版)

2022-04-29 20:12:11 字數 1409 閱讀 4529

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。

現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。

給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。

輸入格式:

輸入檔案共有二行。

第一行為乙個單獨的整數n表示砍過以後的小木棍的總數,其中n≤65

(管理員注:要把超過50的長度自覺過濾掉,坑了很多人了!)

第二行為n個用空個隔開的正整數,表示n根小木棍的長度。

輸出格式:

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

輸入樣例#1:

9

5 2 1 5 2 1 5 2 1

輸出樣例#1:

6

solution

首先我們

想到把所有木棍長度加起來,然後答案肯定是總長度的因數。這時從小到大列舉,如果可以湊出則直接輸出答案,結束程式,按以上方法不加任何剪枝27分。

剪枝一:從大到小排序,從大的列舉層數越少。(33分)

剪枝二:如果當前拼出的長度加上最小的任然超出期望長度,則剪枝。(36分)

剪枝三:玄學剪枝,感謝520巨佬教的,然而並沒有聽懂(67分)

剪枝四:因為有相同的數,所以如果x搜不出答案,則相同的x都不同搜了。(用桶排的小夥伴不需要這個)(100分)

以下是**,然而用桶牌的小夥伴看不懂可以去520的巨佬部落格看看,貼下他的鏈結

#include#include

#include

#include

#include

using

namespace

std;

int cnt,a[70],maxn,sum[70

];bool vis[70

];void check(int step,int x,int num,int all,int

last)

if(num==x)

if(x-numreturn ;//

剪枝tow

for(int i=last+1;i<=cnt;i++)

}return

;}

bool cmp(int x,int

y)int

main()

}sort(a+1,a+1+cnt,cmp);//

剪枝one

for(int i=maxnn;i<=maxn;i++)//

從最大的棍子長度開始列舉,應該也算乙個剪枝吧。

}return0;

}

洛谷 1120 小木棍 資料加強版

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

洛谷 P1120 小木棍 資料加強版

題目 小木棍 思路 搜尋 剪枝。外層迭代加深,列舉最小長度,用dfs判斷。dfs維護3個變數x,y,lst,即用了x根木棍,當前拼到了y,上一根木棍的長度為lst。然後列舉拼接的木棍就好。剪枝一 從大到小排序。剪枝二 如果y不為0,那麼列舉的木棍長不要大於lst,不然就會重複搜尋。剪枝三 如果y 0...

洛谷 P1120 小木棍 資料加強版

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