小明的花費預算time limit: 1000ms memory limit: 65536k
題目描述
小明終於找到乙份工作了,但是老闆是個比較奇怪的人,他並不是按照每月每月的這樣發工資,他覺得你想什麼時候來取都可以,取的是前邊連續幾個月中沒有取的工資,而小明恰好是乙個花錢比較大手大腳的人,所以他希望每次取得錢正好夠接下來的n個月的花費。
所以讓你把這n個月分成正好m組。每個組至少包含乙個月,每組之中的月份必須是連續的,請你為他分組,使得分得的組中最大的總花費最小。
輸入 第一行是兩個整數,n(1 ≤ n ≤ 100,000)和m (1 ≤ m ≤ n)
接下來的n行是連續n個月的花費,第i+1行是第i個月的花費。
輸出 輸出滿足最大的總花費最小的那個組的總花費。
示例輸入
5 3
3 2
9 4
1示例輸出
9提示
將5個月分為3組,第一組(3,2),第二組(9),第三組(4,1),第二組的總花費最大為9,若按其他的方式分,花費最大的那一組的總花費將》=9.
** lwn
#include #include#define oo 50010
#define inf 0x3f3f3f3f
using namespace std;
int main()
{ int n,m;
int a[100010];
while(~scanf("%d%d",&n,&m))
{int low = 0,high =0;
for(int i=0;i
這道題的思想是二分答案,即先確定答案的範圍,然後在範圍內通過不斷二分來確定答案。
首先根據題意,我們根據分得的所有組中的最大花費來確定二分的範圍 [low, high],最小的情況 low 是花費最大的乙個月自成一組,而最大的情況 high 是所有月全部構成一組。確定好二分範圍後,每次我們二分時,都取中間值 mid 作為假設的答案,即分得的所有組中的最大花費,然後遍歷一遍陣列,以 mid 為花費上限盡可能少地分組,並根據分得的組數 cnt 來進行下一步判斷:
如果 cnt > m,說明以 mid 作為最大花費分得的組數過多,mid 太小,不是合法答案,故要到右半邊繼續二分;
如果 cnt <= m,說明以 mid 作為最大花費分得的組數正好或偏少,由於我們是按照花費不大於 mid 且使組數盡可能少的原則分組(不夠 m 的話可以通過拆分某些組來使組數達到 m),故 cnt <= m 的情況是合法答案,更新最終結果 ans = min(mid ,ans) 並向左半邊繼續二分(由於向左二分,每次得到的合法答案都必然比上一次的小,因此我們也可以直接寫成 ans = mid)。
SDUT 2778 小明的花費預算(二分答案)
time limit 1000ms memory limit 65536k 有疑問?點這裡 小明終於找到乙份工作了,但是老闆是個比較奇怪的人,他並不是按照每月每月的這樣發工資,他覺得你想什麼時候來取都可以,取的是前邊連續幾個月中沒有取的工資,而小明恰好是乙個花錢比較大手大腳的人,所以他希望每次取得錢...
SDUT 2778 小明的花費預算
time limit 1000ms memory limit 65536kb problem description 小明終於找到乙份工作了,但是老闆是個比較奇怪的人,他並不是按照每月每月的這樣發工資,他覺得你想什麼時候來取都可以,而小明恰好是乙個花錢比較大手大腳的人,所以他希望每次取得錢正好夠接下...
二分查詢與二分答案
主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...