问题描述
高考结束后,同学们大都找到了一份临时工作,渴望挣得一些零用钱。从今天起,Matrix67将连续工作N天(1<=N<=100 000)。每一天末他可以领取当天及前面若干天里没有领取的工资,但他总共只有M(1<=M<=N)次领取工资的机会。Matrix67已经知道了在接下来的这N天里每一天他可以赚多少钱。为了避免自己滥用零花钱,他希望知道如何安排领取工资的时间才能使得领到工资最多的那一次工资数额最小。注意Matrix67必须恰好领工资M次,且需要将所有的工资全部领走(即最后一天需要领一次工资)。
输入格式
第一行输入两个用空格隔开的正整数N和M
以下N行每行一个不超过10000正整数,依次表示每一天的薪水。输出格式
输出领取到的工资的最大值最小是多少。
这题是一个二分答案,模板很简单,我却做了亿小时(我太拉了) 。实际上,去二分它最小的数,用lyt()去判断是否可行即可;
#include <bits/stdc++.h>
using namespace std;
int n,m,a[100010];
int lyt(int min){
int duan=1,day=1,max=0;
while(day<=n){
if(a[day]>min){
return 0;
}
if(max+a[day]<=min){
max+=a[day];
}else{
duan++;
max=a[day];
}
day+