二分答案。打工

 

F.打工
Time Limit: 1000 MSMemory 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
300
Sample 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;
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q619718

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值