2005: 光盘行动(New Online Judge)

文章讲述了如何利用C++编程解决一个关于剩菜打包的问题,目标是在规定时间内找到能装下所有菜品且数量最少的打包盒的最小容量。通过样例输入和输出展示了解题方法:计算每个菜品需要的打包盒数量,然后使用二分查找确定最小容量。
摘要由CSDN通过智能技术生成

2005: 光盘行动(New Online Judge)

题目描述

Alice看到了有很多菜没最后都没有吃完。
本着不浪费的精神,她决定将这些菜打包好分发给各位亲戚带走。
每分钟,Alice可以选择一份菜,填满一个打包盒(如果填不满也不会用其他的菜去补充)。
距离散会还有一段时间,他们希望你计算一下所需打包盒的最小容积
这样既能准时完成所有菜品的打包,也能分成更多份给不同的人。

输入

第一行是样例个数K(1<=K<=1000)。
每组样例的第一行是剩菜的个数N(1<=N<=1000),可用时间T(1<=T<=1000),保证N<=T(即:只要打包盒的容积足够大,就一定能在规定时间内打包完所有的菜)。
第二行N个整数,表示每盘菜的剩余量Ai(1<=Ai<=10000)。

输出

每组样例输出一个数字,即打包盒的最小容量。

样例输入

3
4 8
3 6 7 11
5 6
30 11 23 4 20
5 9
10 11 12 13 14

样例输出

4
23
10

提示信息

题意:一盘菜可以用多个打包盒打包,在规定时间内,打包完所有的菜为止,而填满一个打包盒需要一分钟。因此,本题就是求打包盒的数量小于规定时间的最小打包盒容积

题解1(C++版本)

#include<bits/stdc++.h>
using namespace std;

int k, n, t, a[1010];  

bool check(int x){ //打算用容量为x的打包盒打包所有的菜 
	int cnt = t;
	for(int i = 1; i <= n; i++){
		cnt -= ((a[i] - 1)/x + 1); //向上取整,比如 a[i] = 3, x = 4, 需要两个打包盒,即(3 - 1)/4 + 1 = 2 
		if(cnt < 0) return false;
	}
	return true;
}

int main(){
	scanf("%d", &k);
	while(k--){
		scanf("%d%d", &n, &t);
		for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
		int L = 0, R = 1e7 + 1, mid;
		while(L + 1 < R){
			mid = (R + L)/2;
			if(check(mid)) R = mid;
			else L = mid; 
		}
		printf("%d\n", R);
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值