### 伪代码
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;
}