题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_D
有n个货物顺序排列,k个卡车,问每个卡车的容量相同,最小容量是多少,能装完所有货物。
因为p越大,能装的货物越多。初始想法是,对p进行从0开始的遍历,但是利用p的递增特性,可以对p的范围做二分查找。
代码如下:
#include <cstdio> #include <iostream> #include <vector> using namespace std; typedef long long ll; int n,k; ll A[100010]; bool f(ll p){ ll temp=p; int x=0; for(int i =0;i<k;i++){ while(temp>=A[x]){ temp-=A[x]; x++; } temp=p; } if(x>=n) return true; else return false; } ll binary_find(ll left,ll right){ ll mid; while(left+1<right){ mid=(left+right)/2; if(f(mid)) right=mid; else left=mid; } return right; } int main(){ ll p,sum; cin>>n>>k; for(int i = 0;i<n;i++){ cin>>A[i]; sum+=A[i]; } p=binary_find(0,sum); cout<<p<<endl; return 0; }
错点:
1.货物都是顺序排列
2.输入数据范围决定了,存储要用longlong
3.输入数据不能存在vector里,要开大数组,否则RE