NEFU 1211 (二分枚举)

版权声明:欢迎转载,请注明出处噢,谢谢 https://blog.csdn.net/DT2131/article/details/53761733

题意:

中文

(样例解释:

第一组:用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

展开阅读全文

没有更多推荐了,返回首页