二分答案 小明的花費預算

2021-07-27 05:52:09 字數 1384 閱讀 8457

小明的花費預算

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...