匿名
嗯經過了一個小時與我覺得是k(lg k)的超麻煩還不知道對不對的做法奮鬥之後
現在帶來的是k(lg k)的優質做法
雖然我也不知道對不對🙄🙄
就是勒 把n是哪幾個2的次方的和丟到一個priority queue裡面
(例如n=23就把4 2 1 0丟進去)
如果這時候pq的大小>k表示無解
如果有解
就每次都挑max
pop掉
再push兩個max-1進去
一直到pq的大小=k為止
就是答案啦
來說說超麻煩的k(lg k)好了
因為最大的那個必定介於lg(n/k)~lg n之間
(大於lg(n/k)是因為
如果最大的小於lg(n/k)
那最後加起來不可能到n
小於lg n應該不用解釋啦)
然後就遞迴跑啦
f(n, k)會對於所有max= lg(n/k)~lg n的整數 去跑
如果f(n-pow(2, max), k-1)存在解就把它算出來
不存在就繼續下一個max
如果不存在任何一組合法的解就輸出No啦
因為總共k層
每層都要跑(lg n) - (lg(n/k)) = lg k次
所以應該是k(lg k)啦
然後
如果答案沒有-1 -1這種鬼東西的話
這解法應該是對的
可是它就是有
我又很偷懶不想處理小數🙄🙄
你可能有興趣的文章...
全部留言
B1 f(n-pow(2, max), k-1)裡面的n-pow(2, max)會變成小數 感覺開double會有誤差🙄🙄