蓝桥杯省赛无忧 编程28 妮妮的月饼工厂

在这里插入图片描述
在这里插入图片描述

这个问题可以用二分搜索法来解决。我们需要找到最大的月饼高度 h,使得可以用给定的原材料切割出至少 K 个高度为 h 的月饼。

我们可以如下进行:

  1. 初始化最低高度 low0(因为月饼高度至少为 1,但我们从 0 开始因为二分搜索将会计算中间值),最高高度 high 为原材料中的最大值。

  2. 执行二分搜索:

    • 找到 lowhigh 的中间值 mid

    • 计算当前 mid 高度可以切割出多少个月饼。这可以通过遍历每块原材料,将其高度除以 mid 并累加得到。

    • 如果我们能切割出大于或等于 K 个月饼,那么我们知道可以有更大的 mid 值,因此更新 low = mid + 1

    • 如果不能切割出足够的月饼,我们需要降低 mid 值,所以更新 high = mid - 1

  3. 继续步骤2直到 low 大于 high。最终的结果(最大高度)就是 high,因为我们在最后一次检查能够得到 K 个月饼时更新了 low,导致 low 变得太大。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int N, K;
    cin >> N >> K;
    vector<int> materials(N);
    for (int i = 0; i < N; ++i) {
        cin >> materials[i];
    }

    long long low = 1, high = *max_element(materials.begin(), materials.end());
    long long result = -1;

    while (low <= high) {
        long long mid = low + (high - low) / 2;
        long long count = 0;
        for (int h : materials) {
            count += h / mid;
        }
        if (count >= K) {
            result = mid; // 更新结果为当前mid值
            low = mid + 1; // 尝试更大的高度
        } else {
            high = mid - 1; // 减少高度以增加月饼数量
        }
    }

    cout << result << endl;
    return 0;
}

这段代码将检查所有可能的高度,直到找到可以用来切割至少 K 个月饼的最大高度。需要注意的是,如果输入的 K 大于所有材料的总高度,那么不可能制作出 K 个月饼,因此二分搜索会返回 -1
在这里插入图片描述

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值