查找的应用——计算最优解

题目:
传送带一次传来了重量分别为wi(i=0,1,…,n-1)的n个货物。现在要将这些货物装到k辆卡车上。每辆卡车可装载的货物数大于等于0,但货物重量总和不得超过卡车的最大运载量p.所有的卡车的最大运载量p一致.

输入: 第一行输入整数 n和整数k,用空格隔开.接下来n行输入n个整数wi,每个数占1行.

输出: 输出p的最小值,占1行.

限制 1<=n<=100000;1<=k<=100000;1<=wi<=10000

输入示例
5 3
8
1
7
3
9

输出示例
10

注:第1辆卡车装2个货物{8,1},第二辆卡车装2个货物{7,3},第3辆卡车装1个货{9},因此最大运载量的最小值为10

利用二分查找

#include<stdio.h>
#define MAX 100000
typedef long long llong;
int n,k;
llong T[MAX];
int chek(llong p);
int solve();
//k辆最大运载量p的卡车最多能装多少货物
int chek(llong p)
{
    
    
	int j,s,i=0;
	for(j=0;j<k;j++)
	{
    
    
		s=0;
		while(s+T[i]<=p)
		{
    
    
			s+=T[i];
			i++;
			if(i==n) return n;
		}
	}
	return i;
 } 
 //二分查找
int solve() 
{
    
    
	llong left=0,right=100000*10000,mid;
	while(right-left>1)
	{
    
    
		mid=(right+left)/2;
		llong v=chek(mid);
		if(v==n) right=mid;
		else left=mid;
	}
	return right;
} 
int main()
{
    
    
	scanf("%ld %ld",&n,&k);
	for(int i=0;i<n;i++)
	{
    
    
		scanf("%ld",&T[i]);
	}
	llong m;
	m=solve();
	printf("%ld",m);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46724903/article/details/114272336