木材加工 解题报告
木材加工 解題報告
Description\rm DescriptionDescription
描述
木材廠有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭(木頭有可能有剩余),需要得到的小段的數目是給定的。當然,我們希望得到的小段木頭越長越好,你的任務是計算能夠得到的小段木頭的最大長度。木頭長度的單位是cmcmcm。原木的長度都是正整數,我們要求切割得到的小段木頭的長度也是正整數。
例如有兩根原木長度分別為111111和212121,要求切割成到等長的666段,很明顯能切割出來的小段木頭長度最長為555.
輸入
第一行是兩個正整數NNN和KKK(1≤N≤100000,1≤K≤100000000)(1 ≤ N ≤ 100000,1 ≤ K ≤ 100000000)(1≤N≤100000,1≤K≤100000000),NNN是原木的數目,KKK是需要得到的小段的數目。
接下來的NNN行,每行有一個111到100000000100000000100000000之間的正整數,表示一根原木的長度。
輸出
能夠切割得到的小段的最大長度。如果連1cm1cm1cm長的小段都切不出來,輸出“0”“0”“0”。
輸入樣例
3 7
232
124
456
輸出樣例
114
解題部分
思路
二分切割的長度,用這個長度去切木頭,看看可以切多少段,當段數小于數目時,就說明切的長度太長,需要縮小,則把 r\rm rr 賦值為mid\rm midmid,同理,當段數大于數目時,就說明切的長度太短,需要放大,則把 l\rm ll 賦值為mid\rm midmid。
int l=0,r=100000;//細節,如果這里l設為1,那么當切不了的時候,就會輸出1。所以要用0。 while(l+1 < r) {ans=0;//細節:計數器要歸零。int mid=(l+r)/2;for(int i=1; i<=n; i++)ans+=a[i]/mid;//累加能切的段數if (ans>=k)l=mid;else if (ans<k)r=mid; }提交代碼地址
提交代碼地址(有改動)
注:在做第二道題時,可以把繩子擴大100倍再進行二分答案。記得看好許局類型,什么時候用double,什么時候用int。
總結
- 上一篇: FPGA中利用ICAP原语实现Multi
- 下一篇: java方法