NEFU 1211 (二分枚举)

题意:

中文

(样例解释:

第一组:用5天卖7件物品,最优答案每天的情况分别为(100+400, 300+100, 500 ,101 ,400),5天中最大值为500。

组:用2天卖4件物品,最优答案每天的情况分别为(2+642),2天中最大值为8

若第二组可以用3天卖4件物品,最优答案每天的情况分别为(2, 64+2),3天中最大值为6

思路:

二分枚举每天卖的最大值上限。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=100005;
long long a[MAXN],fans;
int T,n,m;
bool solve(long long lim){
    long long sum=0;
    long long cost=1;
    long long ans=0;
    int i=0;
    while(1){
        if(i>=n) break;
        if(cost>m) return 0;
        if(a[i]+sum>lim){
            ans=max(ans,sum);
            sum=0;
            cost++;

            continue;
        }
        sum+=a[i];
        i++;
    }
    return 1;
}
int main(){
    cin>>T;
    while(T--){
        cin>>n>>m;
        long long ri=0;
        for(int i=0;i<n;i++){
            scanf("%lld",&a[i]);
            ri+=a[i];
        }
        long long le=ri/m;
        fans=ri;
        long long mid=(le+ri)/2;
        while(le<=ri){
            mid=(le+ri)/2;
            //cout<<le<<' '<<ri<<' ';
            if(solve(mid))
                ri=mid-1;
            else
                le=mid+1;
            //cout<<fans<<endl;
        }
        cout<<le<<endl;
    }
}

Description

你的朋友小明有n个古董,每个古董的价值给出,然后小明要在接下来的m天内将所有古董依次卖出(注意:必须依次卖出,也就是从第一个开始卖卖到最后一个),小明希望
的是这m天内卖出的价值和的最大值最小,你来帮助他把

Input

一共T组数据,每组一个n和m,代表n个古董以及m天(1&lt;=m&lt;=n),然后下面n行为古董的价值,古董价值为1到10000(1&lt;=n&lt;=100000)

Output

输出m天内卖出的古董价值和的最大值(当然是最优的时候),我们希望的是这个最大值越小越好

Sample Input

3
7 5
100
400
300
100
500
101
400
4 3
2
6
2
4
4 2
2
6
2
4

Sample Output

500
6
8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值