喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。
現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。
給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。
輸入格式:
輸入檔案共有二行。
第一行為乙個單獨的整數n表示砍過以後的小木棍的總數,其中n≤65
(管理員注:要把超過50的長度自覺過濾掉,坑了很多人了!)
第二行為n個用空個隔開的正整數,表示n根小木棍的長度。
輸出格式:
輸出檔案僅一行,表示要求的原始木棍的最小可能長度
輸入樣例#1:
95 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 ...