CodeVS1766 装果子【二分答案】

小明需要将n棵果树的果子装进m个袋子,每袋体积为v。他按顺序尝试将每棵树的果子装入当前袋子,若无法装满则换新袋。目标是最小化v。该问题可通过二分搜索求解,枚举上限为所有果子体积和,检查是否能在m个袋子内完成装果子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目描述】
果园里有n颗果树,每棵果树都有一个编号i(1≤i≤n)。小明已经把每棵果树上的果子都摘下来堆在了这棵树的下方,每棵树下方的果子体积为ai。
现在小明将拿来m个袋子把这些果子都装进袋子里。每个袋子的体积为v。小明会按照如下规则把果子装进袋子里:
(a)从第1棵果树开始装起,由1到n一直装到第n棵果树。
(b)如果这棵果树下的果子能全部装进当前这个袋子,就装进去;如果不能,就关上当前这个袋子,打开一个新的袋子开始装。
小明希望在能把所有果子都装进袋子里的前提下,v尽量小。m个袋子并不一定都要装进果子。
【题解】
这个题是让我们求最小的容积在m个及其以内的情况下来装下所有的果子。在枚举的过程中,这个m显然是要逐步减小的,也就是说这个二分是向左平移的。此外,我们还需要知道枚举的上界,也就是初始的rg值,这里应该是最大可能容积,也就是所有果子的体积和。
(这道题就是向右平移的:CodeVS1725
当然,我们还需要check函数来取舍答案,这里直接用check函数来模拟装果子的过程,计算需要的袋子个数,比对就行了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值