ALDS1_4_D:Allocation

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

猜你喜欢

转载自blog.csdn.net/qq_33982232/article/details/80375376
今日推荐