题目描述:
孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 颗桃树,每颗树上都有桃子,守卫将在 H 小时后回来。孙悟空可以决定他吃蟠桃的速度 K(个/小时),每个小时选一颗桃树,并从树上吃掉 K 个,如果树上的桃子少于 K 个,则全部吃掉,并且这一小时剩余的时间里不再吃桃。
孙悟空喜欢慢慢吃,但又想在守卫回来前吃完桃子。请返回孙悟空可以在 H 小时内吃掉所有桃子的最小速度 K(K 为整数)。如果以任何速度都吃不完所有桃子,则返回 0。
输入描述:
第一行输入为 N 个数字,N 表示桃树的数量,这 N 个数字表示每棵桃树上蟠桃的数量;
第二行输入为一个数字,表示守卫离开的时间 H,其中,数字通过空格分割,N、H 为正整数,每棵树上都有蟠桃,且 0<N<10000,0<H<10000。
输出描述:
吃掉所有蟠桃的最小速度 K,无解或输入异常时输出 0。
示例1:
输入
2 3 4 5
4
输出:
5
示例2:
输入
2 3 4 5
3
输出
0
示例3:
输入
30 11 23 4 20
6
输出
23
C++源码:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int eatFinish(vector<int>& peaches, int H) {
int left = 1, right = 10000, K = 10000; // 初始化二分查找的范围和答案
while (left <= right) {
int mid = (left + right) / 2; // 计算中间值,即尝试的吃桃速度K
int allTime = 0;
for (int x : peaches) { // 遍历每棵桃树
allTime += (x + mid - 1) / mid; // 计算以当前速度mid吃完这棵树上的桃子需要的小时数
}
if (allTime <= H) { // 如果计算出的总时间小于或等于守卫离开的时间
K = mid; // 更新答案为当前速度
right = mid - 1; // 尝试更小的速度以找到更小的满足条件的K
}
else {
left = mid + 1; // 增大速度,因为当前速度不足以在守卫回来前吃完所有桃子
}
}
return K;
}
int main() {
string input;
getline(cin, input);
stringstream ss(input);
vector<int> peaches;
int peachCount;
while (ss >> peachCount) {
peaches.push_back(peachCount); // 读取输入,将桃子数量转换成整数列表
}
int H;
cin >> H; // 读取守卫离开的时间H
if (H < peaches.size()) { // 如果守卫离开的时间小于桃树的数量,则不可能吃完所有的桃子
cout << 0 << endl;
return 0;
}
int K = eatFinish(peaches, H);
cout << K << endl; // 输出最小的速度K
system("pause");
return 0;
}
544

被折叠的 条评论
为什么被折叠?



