0
点赞
收藏
分享

微信扫一扫

收入计划

贵州谢高低 2022-04-05 阅读 48
c++
收入计划
时间限制 : 1000 MS   空间限制 : 65536 KB

问题描述

高考结束后,同学们大都找到了一份临时工作,渴望挣得一些零用钱。从今天起,Matrix67将连续工作N天(1<=N<=100 000)。每一天末他可以领取当天及前面若干天里没有领取的工资,但他总共只有M(1<=M<=N)次领取工资的机会。Matrix67已经知道了在接下来的这N天里每一天他可以赚多少钱。为了避免自己滥用零花钱,他希望知道如何安排领取工资的时间才能使得领到工资最多的那一次工资数额最小。注意Matrix67必须恰好领工资M次,且需要将所有的工资全部领走(即最后一天需要领一次工资)。

输入格式

第一行输入两个用空格隔开的正整数N和M
以下N行每行一个不超过10000正整数,依次表示每一天的薪水。

输出格式

输出领取到的工资的最大值最小是多少。

样例输入 1

7 5
100
400
300
100
500
101
400

样例输出 1

500 

样例输入 2

10 7
10
327
162
465
443
194
276
430
492
326

样例输出 2

499

提示

#include<bits/stdc++.h>
using namespace std;
int A[100005],n, m;
long long Sum;
bool Check(long long k){
	int l=1,t=m;
	long long s=0;
	while(l<=n&&t>0){
		s=0;
		while(s+(long long)A[l]<=k&&l<=n)	s+=(long long)A[l++];
		t--;
	}
	if(l<=n)	return 0;
	else	return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)	scanf("%d",&A[i]),Sum+=A[i];
	long long left=1,right=Sum;
	while(left<right){
		long long mid=(left+right)/2;
		if(Check(mid))	right=mid;
		else	left=mid+1;
	}
	printf("%d",right);
	return 0;
}

 

举报

相关推荐

0 条评论