10690 分面包

### 伪代码

1. 读取输入的 `n` 和 `m`,以及 `m` 个面包的长度 `L`。
2. 定义一个函数 `canDivide(length)`,判断是否可以将所有面包分成每人 `length` 长度的面包。
3. 使用二分法查找每人分得的最长面包长度:
   - 初始化 `low` 为 0,`high` 为所有面包长度的最大值。
   - 在 `low` 小于 `high` 的情况下,计算中间值 `mid`。
   - 如果 `canDivide(mid)` 返回 `true`,则更新 `low` 为 `mid`,否则更新 `high` 为 `mid`。
4. 输出结果,保留两位小数。

### C++代码

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

using namespace std;

bool canDivide(const vector<int>& lengths, int n, double length) {
    int count = 0;
    for (int l : lengths) {
        count += static_cast<int>(l / length);
    }
    return count >= n;
}

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    vector<int> lengths(m);
    for (int i = 0; i < m; ++i) {
        scanf("%d", &lengths[i]);
    }

    double low = 0, high = *max_element(lengths.begin(), lengths.end());
    while (high - low > 1e-4) { // Precision to 0.01
        double mid = (low + high) / 2;
        if (canDivide(lengths, n, mid)) {
            low = mid;
        } else {
            high = mid;
        }
    }

    printf("%.2f\n", low);
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值