第五章 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;}
阅读全文