二分練習題8 月度開銷 題解

2022-08-19 22:12:17 字數 1248 閱讀 7588

題目描述

農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來 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
提示

若約翰將前兩天作為乙個月,第

三、四兩天作為乙個月,最後三天每天作為乙個月,則最大月度開銷為500。其他任何分配方案都會比這個值更大。

題目分析

本題涉及演算法:二分。是使用「二分答案」來進行問題的求解。

這道題目其實和「最大值最小化」那道題一模一樣。只是題目描述不一樣。

首先我們需要寫乙個函式 \(bool check(int num)\) 來判斷每個fajo月的天數設為 \(num\) 天時是否滿足要求。

然後我們設 \(l = 0\) (左邊界),設 \(r = 10^9\) (右邊界),進行二分,最終就可以和「最大值最小化」那道題一樣求解得到滿足條件的最小的fajo月的開銷了。

實現**同「最大值最小化」。

實現**如下:

#include using namespace std;

const int maxn = 100010;

int n, m, a[maxn], sum;

// check函式用於驗證每個fajo月的開銷設為num是否可行

bool check(int num)

}return true;

}int main()

int l = 0, r = sum, res;

while (l <= r)

else l = mid + 1;

}cout << res << endl;

return 0;

}

二分,月度開銷

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

二分查詢 06 月度開銷

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

4135 月度開銷(二分查詢)

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