P1120 小木棍 資料加強版

2022-05-14 01:07:42 字數 1477 閱讀 5650

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

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

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

輸入格式:

輸入檔案共有二行。

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

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

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

輸出格式:

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

輸入樣例#1:

9

5 2 1 5 2 1 5 2 1

輸出樣例#1:

6

2017/08/05

資料時限修改:

-#17 #20 #22 #27 四組資料時限500ms

-#21 #24 #28 #29 #30五組資料時限1000ms

其他時限改為200ms(請放心食用)

剛開始沒讀懂題意,然後糾結了好久。發現原來題意是這樣的,求用完全部木棍能夠成的最小長度的組合木棍的長度。

搜尋,盡量優化才能過。

優化方案:1先選大的,後選小的。

2當前條件成立時,不必進行同類搜尋(因為這就屬於最優解)

3列舉長度時,把陣列中直接符合的,預先刪去以減少搜尋量

#include#include

#include

#include

#include

#include

using

namespace

std;

int n,a[69

],cnt,c,m;

int ans=0,vis[70

];int

tot,maxn;

bool cmp(const

int x,const

inty)

void dfs(int h,int last,int sum,int

h)

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

if(!vis[i])

if(h+a[i] ==h)

if(h+a[i]==h || h==0) break

;

while( a[i+1] == a[i]) i++;

}return;}

intmain()

}n=cnt;

sort(a+1,a+1+n,cmp);

int sum=0

;

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

i每根長度,tot/i,根數

dfs(

0,0,sum,i);

}

return0;

}

P1120 小木棍 資料加強版

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過 50 現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。首先在讀入的時候忽略掉長度大於50的木棍 最重要 順便還要記錄一下最短的木...

P1120 小木棍 資料加強版

原題鏈結 不得不說,這題真的是一道深度搜尋毒瘤題qwq,整整坑了我乙個上午。先說一下大體思路 1.讀入資料的同時 注意過濾掉長度大於50的木棍 算出所有小木棍的總和sum,因為至少所有的小木棍會拼成一根長度為sum的超大木棍 2.找出所有小木棍中長度最大的那根max,原始長度len一定大於等於這個m...

P1120 小木棍 資料加強版

一道不錯的剪枝題,用到的剪枝優化比較多,剪枝思路也值得學習 在這裡我只採取了能通過此題的剪枝,似乎還可以繼續優化?剪枝講解在注釋裡 include include include include includeusing namespace std const int maxn 70 inline ...