對於POJ 1011的一點理解

2021-06-27 15:57:04 字數 1868 閱讀 4426

description

喬治拿來一組等長的木棒,將它們隨機地砍斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的長度都用大於零的整數表示。

input

輸入包含多組資料,每組資料報括兩行。第一行是乙個不超過64的整數,表示砍斷之後共有多少節木棍。第二行是截斷以後,所得到的各節木棍的長度。在最後一組資料之後,是乙個零。

output

為每組資料,分別輸出原始木棒的可能最小長度,每組資料佔一行。

sample input

9

5 2 1 5 2 1 5 2 1

41 2 3 4

0

sample output

6

5

這是我在poj上面ac的第二道題目,剛開始做的時候,想的很簡單,只要找到乙個數,滿足大於等於劈斷後的棒子的最大長度,且是所有劈斷棒子的和的因數就行,沒有考慮到分配木棒使它們一一匹配起來。

現在考慮到要把棒子一一匹配以來看看是不是滿足自己假定的原木棒的長度,這就是這道演算法題目的關鍵。首先是對於已經匹配過的棒子,要做標識,下次匹配的時候就不能再次使用,剛開始是想到用結構體實現,如下

struct element

int num;

bool  used;

這樣表示乙個資料成員,但是這樣在排序的時候比較麻煩,一次就單獨列出乙個與木棒大小一一對應的陣列sign[n]來標識木棒是否被使用。

下面的問題就是,在假定的原木棒長度下,怎麼判斷劈斷的木棒能不能匹配。實現的思路如下:首先將劈斷的木棒進行降序排序,然後將排序後陣列的第乙個元素(也就是陣列的最大值)賦值給假定的原木棒的長度,然後在原木棒的基礎上依次增加1,首先判斷是不是木棒長度和的因數,如果是,就進行能付成功讓所有劈斷木棒匹配的判斷。

其判斷基本思路是從陣列第乙個元素開始,如果該元素a[i]沒有被使用,判斷它是不是小於要拼成假定原木棒長度len,還需要的木棒長度others,如果小於,就用others減去a[i],知道減到0為止,或者判斷當前的others小於作比較的a[i],則認為匹配失敗。如果匹配成功,則匹配下一根,直到所有的木棒都匹配成功,則認為當前假定的原木棒的長度是滿足要求的。

這樣的演算法,很像是給定乙個數字k,然後判斷該數字能不能用給定陣列a[n]裡裡面的幾個數字的和表示。我們的做法,就是將陣列降序排序,從第乙個元素開始比較,如果k>a[i],就用k-a[i]作為當前的k的值,這樣不斷的減,如果到最後k的值能夠減到0,則認為k能夠用陣列a[i]裡裡面的幾個數字的和表示。

下面是我實現的具體**

#include

#include

using namespace std;

int a[64],sign[64];     //陣列sign是用來標識小木棒是否已經用過

bool compare(int a,int b)

int func(int len, int others,int n,int t)//目標棒的長度,拼成乙個棒還需要的,陣列的長度,陣列裡面還沒有使用的木棒數量 

if(others<=a[i])

break;//如果剩餘匹配長度《當前沒有使用的木棒的長度,則認為匹配失敗

}return 0;

}int main()

sort(a,a+n,compare);//對其進行降序排列      

for(int len=a[0];len<=sum;len++)

}   

cout<}

return 0;

我認為,這段**還有值得改進的地方,最大的改進的地方應該是匹配失敗條件的判斷問題,我這樣做能夠解決問題,但是判斷條件不夠優化,還有就是判斷條件的位置。

清大神多多指教

POJ1011 一種dfs實現

已經刪掉了剪枝,如果要ac還要繼續剪枝,思路大家可以自己思考一下 本題主要使用的思想是dfs的第三種型別,還原現場,dfs三種型別詳情可參閱本人部落格poj1015那篇 include include includeusing namespace std int n int maxx int min...

對於錘子科技的一點理解

最近總聽到有 爆料錘子要倒閉了,自己也是乙個數碼愛好者,隨便談談自己對錘子科技的一點認識吧。乙個外行人 拿著風投圓自己的夢。我覺得是對錘子最好的定位。全世界有多少手機廠商?比錘子有錢的,有經驗的至少有十家吧,怎麼就沒發現走情懷,工匠精神這條路能生存?肯定是這裡面有很多連這些大廠都不願去觸碰的問題。消...

對於原型鏈的一點理解

先舉個簡單的例子 var a 0 a.data data 可以用a.data取值 a.proto data1 data1 可以用a.data1取值 a.proto proto data2 data2 可以用a.data2取值 a.proto proto proto data3 data3 canno...