第五章 ALDS1_4_D:Allocation 计算最优解

来源:互联网 发布:不用充值约爱软件 编辑:程序博客网 时间:2024/06/07 18:54

问题链接

ALDS1_4_D:Allocation

问题内容

在传送带不断传送重量为wi的n个货物,现在有k辆卡车,卡车的最大运载量P,求P的最小值。

思路

首先二分P的值,然后模拟装载货物的过程,检测是否能够装好所有货物。二分的left是0,right是所有货物重量的和(假设是sum)。若能够装好,right = mid;若不能装好货物,则left = mid + 1,重复上述步骤直到找到最小值P。

代码

#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long LL;LL A[100000 + 10];int n, k;//模拟装货过程bool check(LL P) {    int cnt = k;    for (int i = 0; i < n; ) {        LL t = P;        cnt--;        // 卡车已经用完,证明卡车当前最大装载量不能装完货物        if (cnt < 0)            return false;        while (i < n && t >= 0) {            // 剩余重量可以装上当前货物            if (t >= A[i])                t -= A[i],i++;            //装不下则用下一辆卡车去装            if (t < A[i])                break;        }    }    return true;}// 二分找出P的最小值LL BinarySearch(LL sum) {    LL left = 0, right = sum;    LL mid;    while (left + 1 < right) {        mid = (left + right) / 2;        //可以装好货物        if (check(mid))            right = mid;        else            left = mid;    }    return right;}int main() {    LL sum = 0;    scanf("%d %d", &n, &k);    for (int i = 0; i < n; i++) {        scanf("%lld", &A[i]);        sum += A[i];    }    LL P = BinarySearch(sum);    printf("%lld\n", P);    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 昆明犬 昆明地铁 昆明烟花 昆明医科 昆明学院 昆明烟花秀 昆明机场 昆明火车站 昆明烟花展 昆明池 昆明1号线 昆明高铁 昆明邮编 昆明湖 昆明好玩 昆明到宣威 昆明信息港 昆明二手房 昆明市 昆明的雨 昆明南站 昆明特产 昆明世博会 昆明图片 昆明大学 昆明市区 昆明的大学 昆明小吃街 昆明怎么样 昆明到北京 昆明好吗 广州到昆明 昆明风景 昆明气候 昆明景区 昆明特色 昆明北站 昆明吧 昆明 海拔 昆明好吃的 昆明花市