#19298: 非遞迴解法


310573sao (Jiburiru)

學校 : 新北市立板橋高級中學
編號 : 48055
來源 : [59.127.176.2]
最後登入時間 :
2020-04-01 20:44:03
b936. Kevin 愛橘子 -- 有一天Kevin走在路上 | From: [111.248.77.128] | 發表日期 : 2019-09-24 07:12

N 轉成二進制
N 是奇數的時候 (N-1)>>1 = N>>1 , (N+1)>>1=(N>>1)+1
所以當你不斷切成兩堆的時候 你最多也就兩種數字 x , x+1
不斷對所有橘子切成兩堆直到最小片的數量切完後會小於b
令當前最小片數 L=1, 最大片數 R =0
當 N 是奇數的時候, N+1 就會是偶數 所以 N 會分同等份量給 N+1, 而 N+1會乘二 , R=R*2+L, L=L
反之,當 N是偶數 N+1 就是奇數 所以 L=L*2+R, R=R

最後當N/2<b 的時候 有可能 N/2+1==b
這時候如果N是奇數的話 L=L, R=R*2+L=L+R+R 相當於ans+=R
如果是N是偶數的話 L=L*2, 但L相當於N/2的片數 N/2<b所以不用考慮進去

 

以下是數字舉個例子

以 L 代表較小片的橘子數 , R 代表較大片的橘子數

N=21,M=3, binary=10101, [10101]

初始 L=1, R=0

切半後 N=10 or 11, [1010, 1011]

L=1, R=R*2+L=1   (L所代表的數字10, R所代表的數字11)

切半後 N=5 or 6 [101, 101, 101, 110]

L=L*2+R=3, R=1

接下來 5 / 2= 2 < M 但因為 5 / 2+1==M 所以再補上數量 R

切半後 N=2 or 3 [10, 11, 10, 11, 10, 11, 11, 11]

L=L=3, R=R*2+L=5

ans = 5

 

如果有人仍表示不清楚 我會努力補充的 謝謝

 

開 ios::cin.tie, cout.tie 但 cout<<endl; TLE

改成 "\n" 0.7s

改用 scanf printf 0.4s

 

 
ZeroJudge Forum