i_e題(dfs)poj-1011 sticks
uva-307 sticks
是的我又跑去學遞迴了qaq
這個題最好到uva-307去交題 (好像是說poj-1011的資料太水)
題意題意:·····恢復到原來的多根相同的木棍(或只有一根),求原來的木棍長度的最小值。喬治拿了相同長度的木棍,隨機切開,直到所有零件的長度最大為50個單位。 現在,他想將木棍恢復到原始狀態,但是他忘記了原來擁有多少木棍以及它們原本有多長。 請幫助他,設計乙個程式,計算出那些棍子的可能的原始最小長度。 所有以單位表示的長度都是大於零的整數。
輸入
輸入包含2行。 第一行包含切割後的木棍零件數量,最多為64個木棍。 第二行包含被空格隔開的那些部分的長度。 檔案的最後一行包含零。
輸出
輸出應包含原始木棍的最小長度,每行一根。
sample input
95 2 1 5 2 1 5 2 1
41 2 3 4
0sample output65
分析:
設 切開後木棍所有長度 為乙個陣列 a ,所有的長度和為sum 。(此後的 每一組 表示的是 原狀態的每一根木棍的長度 )
原狀態的木棍長度只可能是[陣列中的最大值,sum]之間能整除sum的數,求最小值就從 這些能整除sum的 的第乙個數開始 依次判斷該長度x是否滿足條件 如滿足則原始長度的最小值就是x
(此處滿足條件就是:恰好 (即所有木棍都用組合完了) 構成了 num(num=sum/x) 根長度為x的木棍)
第一步:將所給資料降序排序
第二步:構造dfs函式判斷長度x是否滿足條件
dfs函式中提前結束返回0 的情況:( 以下的滿足條件均表示: 當前組 的總長度 為 x)
對於 當前組 滿足條件 但是 下一組 不滿足條件。
對於 當前組 不滿足條件:對於 當前組 第乙個(其為該組的最長的) 不滿足條件
ac**
//注意:在uva上提交的話 不要用c++的輸入輸出 用c的輸入輸出才沒超時;poj的話沒試過
//#include //poj上用這個我不知道為什麼編譯錯誤
#include
#include
#include
//memset()標頭檔案
using
namespace std;
int n,sum,x,num;
int a[70]
,v[70];
bool
cmp(
int&a,
int&b)
bool
dfs(
int cnt,
int len,
int cntnum)
else
if(len+a[i]
}return0;
//列舉所有木棍都沒得到解,返回0
}int
main()
sort
(a,a+n,cmp)
;for
(x=a[0]
;x<=sum;x++)}
}printf
("%d\n"
,x);
}return0;
}
專題I K個人解題報告 三分
i題 hdu 3714 分析 求f x max si x 畫圖分析易知f x 一定是乙個下凸的影象,三分 這個題的精度要注意,還不會精度到底要怎麼搞,我一般都取1e 7,這次wa了,取了1e 10過了。include using namespace std 把f x max s x 表示出來 int...
動態規劃專題 解題報告 A
乙個經典的貨郎擔問題,加上17的範圍限制各種明示狀態壓縮,用二進位制來表示走過哪幾個城市,我們可以開乙個二維陣列dp i j 表示走過了i的城市,最後在j城市停留的距離。預處理一遍每個城市間的距離,算出dis i j 到dp i j 的狀態可以由 1 1 j k 轉移過來,比較距離儲存最優值就行,然...
動態規劃專題 解題報告 M
別的我不說了,良心題解先吹一波好吧。最重要的使這一段 假如第一位4,第二位7,三四位就可以隨便取了。設這種狀態為 2,2 意思為前兩位已經匹配上了4750的第二位。則用dp 2 2 表示 dp 100010 5 一共5 1e5種狀態 那麼 2,2 就有10種選擇 0 9 會轉移1次到 3,3 選5 ...