演算法 割繩子問題(位元組跳動2019筆試)

2021-09-12 17:50:07 字數 1239 閱讀 7061

@[演算法] 割繩子問題(位元組跳動2019筆試)

總共有n條長度不等繩子,可以任意切割,不能拼接。要求切割後得到m條長度相等的繩子,求問得到的m條繩子長度l的最大值

輸入: 繩子條數n;表示繩子長度的n維陣列l,要求輸出的繩子長度m;

輸出: 長度最大值l

用n維陣列l的每乙個數除以1,2,3, …, m,得到m*n個數,即l[0], l[0]/2, …, l[0]/m,

l[1], l[1]/2, …, l[n-1]/m。將這m*n個數排序,得到陣列sorted, 取其中第m大的元素即為長度l的最大值,即:l=sorted[m-1]

python**

// source code

slist =

for lw in l:

for i in

range

(m)(i+1)

)slist.sort(reverse =

true

)l = slist[m-

1]

先考慮一種簡化的情形,假設每一根繩子只能使用一次(即使繩子很長,可以切割出多條長度為l的小段,也只使用其中一段),那麼這個問題就退化為乙個簡單的排序問題,直接找出其中第m長的繩子,其長度就是l的最大值。這種情形很簡單。

再考慮一種稍微複雜一些的情形:假設每一根繩子最多只能使用兩次,那麼可以對l[0], l[1], …, l[n-1], l[0]/2, l[1]/2, …, l[n-1]/2 這2n個數排序,取其中第m大的數,其值就是l的最大值。

舉個栗子,假設有n=4根繩,長度為a>b>c>d,又有b>a/2>c,要取出m=3條長度相等的繩。則對4*2=8個數排序後前三位是a,b,a/2. 那麼長度l的最大值就是a/2;前三位中最長的繩出現了兩次(a,a/2),第二長的繩出現了一次,而切割出的3個片段中最長的繩可以切出兩個,第二次的繩可以切出乙個,也就是說,每一根繩分出的片段數和它在排序後的陣列的前m位**現的次數是對應的。

如果把上面的條件改為a/2>b,則l的最大值就是b,同樣是a分出兩段,b分出一段。條件改為a/2回到原來的問題,因為不限制每根繩的使用次數,所以一根繩最多使用m次(極端情況a/m>b),因此對l[0], l[1], …, l[n], l[0]/2, l[1]/2, …, l[n]/2, l[0]/3, …, l[n-1]/m共m*n個數排序,再取其第m大的元素既是l的最大值。這種情況下,「每一根繩分出的片段數和它在排序後的陣列的前m位**現的次數相等」這一條件依然能得到滿足。

演算法 圓桌分獎品問題(位元組跳動2019筆試)

圓桌n個人,每乙個人有乙個得分,相鄰兩人中得分高的人得到的獎品比得分低 的人多。每個人至少獲得乙個獎品,問一桌人至少需要準備多少獎品。輸入 人數n,圓桌上每個人的得分s n維陣列 輸出 最少需要的獎品數m 因為是圓桌,得分陣列s應該看作迴圈列表。找出其中的區域性極小點,即得分比左右兩人都低的人,由迴...

母牛生小牛問題 位元組跳動筆試題

母牛從3 7歲初每年會生產1頭母牛,10歲後死亡 10歲仍然存活 假設初始有1頭剛出生的母牛,請問第n年有多少頭母牛?年從第一年開始計數 注 第3年初會出生第一頭牛,故第3年有兩頭母牛 第5年初第3年出生的牛會生產,故第五年有5頭母牛。主類public static void main string...

集合合併問題 《位元組跳動》筆試第二題

題目 輸入 第一行輸入乙個數n,表示下邊有幾行。接下來輸入n行,每一行格式為1,2 3,4 5,6 輸出 將重疊部分進行合併的結果,按從小到大輸出。例如 修改 如下 import sys if name main n input q for i in range int n line sys.std...