描述 Description
高考结束后,同学们大都找到了一份临时工作,渴望挣得一些零用钱。从今天起,Matrix67将连续工作N天(1<=N& lt;=100 000)。每一天末他可以领取当天及前面若干天里没有领取的工资,但他总共只有M(1<=M<=N)次领取工资的机会。 Matrix67已经知道了在接下来的这N天里每一天他可以赚多少钱。为了避免自己滥用零花钱,他希望知道如何安排领取工资的时间才能使得领到工资最多的 那一次工资数额最小。注意Matrix67必须恰好领工资M次,且需要将所有的工资全部领走(即最后一天末需要领一次工资)。
输入格式 InputFormat
第一行输入两个用空格隔开的正整数N和M
以下N行每行一个不超过10000正整数,依次表示每一天的薪水。
输出格式 OutputFormat
输出领取到的工资的最大值最小是多少。
样例输入 SampleInput [复制数据]
7 5 100 400 300 100 500 101 400
样例输出 SampleOutput [复制数据]
500
数据范围和注释 Hint
【样例说明】
采取下面的方案可以使每次领到的工资不会多于500。这个答案不能再少了。
100 400 300 100 500 101 400 每一天的薪水
<------1 <-------2 <---3 <---4 <---5 领取工资的时间
500 400 500 101 400 领取到的工资
#include<iostream>
using namespace std;
int n,m,l,r,mid,ans,Max,sum;
int data[1005];
bool check()
{
int cnt=1,sum=0;
for(int i=1;i<=n;i++)
{
sum+=data[i];
if(sum>mid)cnt++,sum=data[i];
if(cnt>m)
return 0;
}
return 1;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>data[i];
Max=max(Max,data[i]);
sum+=data[i];
}
l=Max;
r=sum;
while(l<=r)
{
mid=(l+r)>>1;
if(check())
ans=mid,r=mid-1;
else
l=mid+1;
}
cout<<ans<<endl;
return 0;
}