演算法實踐 月度開銷(二分)

2021-10-03 12:41:28 字數 1520 閱讀 6531

農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來n(1 ≤n≤ 100,000) 天裡每天需要的開銷。

約翰打算為連續的m(1 ≤m≤n) 個財政週期建立預算案,他把乙個財政週期命名為fajo月。每個fajo月包含一天或連續的多天,每天被恰好包含在乙個fajo月裡。

約翰的目標是合理安排每個fajo月包含的天數,使得開銷最多的fajo月的開銷盡可能少。

第一行包含兩個整數n,m,用單個空格隔開。

接下來n行,每行包含乙個1到10000之間的整數,按順序給出接下來n天裡每天的開銷。

乙個整數,即最大月度開銷的最小值。

7 5

100400

300100

500101

400

500
中等,二分

月度開銷的值應該在 每天開銷最大值 和 每天開銷的總和 之間,通過二分法不斷逼近。judge函式判斷按照mid開銷所分的週期,如果週期大於給定週期m,則可以增加開銷,反之,減小開銷。

def

judge

(mid,l,n,m)

: summary =

0 t =

0for i in

range

(n):

if(summary+l[i]

>mid)

:#如果前幾個月加上這個月的錢大於這次嘗試的fajo月開銷,那麼說明這個月的錢應該放在下個fajo月裡

summary = l[i]

t +=

1else

: summary += l[i]

#繼續增加開銷

if(t>m)

:return

true

#減小開銷

else

:return

false

x =input()

.split(

)n =

(int

)(x[0]

)m =

(int

)(x[1]

)max =

0 total =

0a =

for i in

range

(n):

temp =

(int)(

input()

) total += temp #記錄開銷的總和

if(max: max = temp #記錄開銷的最大值

l = max

r = total

while

(l<=r)

: mid =

(int)(

(l+r)/2

)if(judge(mid,a,n,m)):

l = mid+

1else

: r = mid-

1print

(mid)

月度開銷(二分)

描述農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來 n 1 n 100,000 天裡每天需要的開銷。約翰打算為連續的m 1 m n 個財政週期建立預算案,他把乙個財政週期命名為fajo月。每個fajo月包含一天或連續的多天,每天被恰好包含在乙個f...

openjudge 月度開銷 二分查詢

06 月度開銷 總時間限制 1000ms 記憶體限制 65536kb 描述 農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來 n 1 n 100,000 天裡每天需要的開銷。約翰打算為連續的m 1 m n 個財政週期建立預算案,他把乙個財政週期命名...

二分,月度開銷

009 月度開銷 總時間限制 1000ms 記憶體限制 65536kb 描述農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來 n 1 n 100,000 天裡每天需要的開銷。約翰打算為連續的m 1 m n 個財政週期建立預算案,他把乙個財政週期命名...