题目链接: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