noi1-11`
**
06:月度开销
1000ms
内存限制:
65536kB
描述 农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 N (1 ≤ N ≤ 100,000) 天里每天需要的开销。约翰打算为连续的M (1 ≤ M ≤ N) 个财政周期创建预算案,他把一个财政周期命名为fajo月。每个fajo月包含一天或连续的多天,每天被恰好包含在一个fajo月里。约翰的目标是合理安排每个fajo月包含的天数,使得开销最多的fajo月的开销尽可能少。
输入
**
第一行包含两个整数N,M,用单个空格隔开。
接下来N行,每行包含一个1到10000之间的整数,按顺序给出接下来N天里每天的开销。
输出
一个整数,即最大月度开销的最小值。
样例输入
7 5
100
400
300
100
500
101
400
样例输出
500
**
提示
若约翰将前两天作为一个月,第三、四两天作为一个月,最后三天每天作为一个月,则最大月度开销为500。其他任何分配方案都会比这个值更大。
解题思想:
- 首先他要求fajo月开销最小,如果按照每天都算一个月,那么我们要先找到月份中最大的开销,不可能答案会比这个开销小,所以我们给这个开销作为二分查找的左端点。
- 然后我们要寻找二分查找的右端点,我们可以把所有天当成一个月,求出所有月份资金的和作为右端点。
- 然后我们要寻找判断点,我们可以从左往右推,每次判断一下二分的中间点时候的周期,再与要求的m比较。就可以判断出每一个mid时候的情况,最终找出最大的mid。
#include<bits/stdc++.h>//万能头文件,我用的是c
bool cha(int x,int n,int m,int a[])
{
int sum1=0