F.打工
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 23 (8 users) Total Accepted: 4 (4 users) Special Judge: No Description 旅行者的摩拉又花完了!于是旅行者决定去宵宫的烟花店打工。
旅行者计划在烟花店打工n天,每天打工结束的时候旅行者可以选择领取包括今天在内的之前没有领取的摩拉,旅行者有m次领取摩拉的机会。
旅行者事先知道每天他可以赚取摩拉。为了有效规划摩拉的使用,他想知道如何领取摩拉才能够使获取摩拉最多的那次当天的摩拉数最小。
注意:旅行者必须恰好领取摩拉m次,且需要将全部摩拉领走。Input 第一行输入两个用空格隔开的正整数n和m.(1<=n,m<=1e5)
接下来n行每行一个不超过10000正整数,表示每天能够获取的摩拉数。Output 唯一的一行整数,表示能够领取到的摩拉的最大值最小是多少。
不包含换行
Sample Input 10 7
100
500
300
400
200
300
600
100
200
300Sample Output 600
#include<iostream>
using namespace std;
const int M=1e5+5;
int n,m;
int s[M];
int a=0,b=0;
int check(int x){
int ans=0,now=0;
for(int i=1;i<=n;i++){
if(now+s[i]>x){
ans++;
now=s[i];
}
else
now+=s[i];
}
return ans<m;
}
int solve(int l,int r){
while(l<r){
int mid=(l+r)>>1;
if(check(mid)){
r=mid;
}
else{
l=mid+1;
}
}
return l;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
b+=s[i];
a= min(a,s[i]);
}
printf("%d", solve(a,b));
return 0;
}