文章目录
- 1. 题目描述
- 2. 实现
- 3. 整体思路
- 4. 函数定义及参数解释
- 5.二分查找过程
- 6.主函数部分
1. 题目描述
2. 实现
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int findMinEatingSpeed(vector<int>& piles, int h) {int left = 1;int right = *max_element(piles.begin(), piles.end());int ans = right;while (left <= right) {int mid = left + (right - left) / 2;int hours = 0;for (int pile : piles) {hours += pile / mid + (pile % mid != 0);}if (hours <= h) {ans = mid;right = mid - 1;}else {left = mid + 1;}}return ans;
}int main() {int n;cout << "输入桃树的数量:";cin >> n;if (n <= 0 || n >= 10000) {cout << "0" << endl;return 0;}vector<int> piles(n);cout << "输入每棵桃树上蟠桃的数量:";for (int i = 0; i < n; i++) {cin >> piles[i];if (piles[i] <= 0) {cout << "0" << endl;return 0;}}int h;cout << "输入守卫离开的时间:";cin >> h;if (h <= 0 || h >= 10000) {cout << "0" << endl;return 0;}int result = findMinEatingSpeed(piles, h);cout << result << endl;return 0;
}
3. 整体思路
这段代码的目的是找到孙悟空在给定时间内吃完所有蟠桃的最小吃桃速度。它采用二分查找的方法来高效地确定这个最小速度。
4. 函数定义及参数解释
int findMinEatingSpeed(vector& piles, int h):
这个函数接受两个参数,一个是存储每棵桃树上蟠桃数量的整数向量piles,另一个是守卫离开的时间 h。
函数的返回值是一个整数,表示能够在h小时内吃完所有蟠桃的最小吃桃速度。
5.二分查找过程
- 初始化速度范围:
int left = 1:最小速度初始化为 1,因为速度不能为 0。
int right = *max_element(piles.begin(), piles.end()):最大速度初始化为所有桃树上蟠桃数量的最大值。这是因为如果速度大于这个值,肯定能在更短的时间内吃完所有蟠桃,但我们要找的是最小速度,所以从最大值开始逐步减小。 - 循环进行二分查找:
while (left <= right):只要速度范围的左边界小于等于右边界,就继续进行二分查找。
int mid = left + (right - left) / 2:计算当前速度范围的中间值,作为尝试的吃桃速度。 - 计算以当前速度吃桃所需的时间:
int hours = 0:用于累计以当前速度吃桃所需的总时间。
for (int pile : piles):遍历每棵桃树。
hours += pile / mid + (pile % mid!= 0):计算吃完当前这棵树上的蟠桃所需的时间。如果桃树上的蟠桃数量能被当前速度整除,那么所需时间就是蟠桃数量除以速度;如果不能整除,还需要额外一小时来吃完剩下的蟠桃。 - 根据所需时间调整速度范围:
如果以当前速度吃完所有蟠桃所需的时间小于等于守卫离开的时间h,说明当前速度可能是最小速度之一,或者还可以更小。所以更新答案为当前速度ans = mid,并将右边界调整为mid - 1,继续在更小的速度范围内查找。
如果所需时间大于h,说明当前速度太慢,无法在规定时间内吃完所有蟠桃,将左边界调整为mid + 1,在更大的速度范围内查找。 - 返回结果:
最终,函数返回ans,即能够在h小时内吃完所有蟠桃的最小吃桃速度。
6.主函数部分
- 输入处理:
首先从用户输入获取桃树的数量n,如果n不满足条件(0 < n < 10000),则输出 0 并返回。
接着创建一个大小为n的整数向量piles,用于存储每棵桃树上蟠桃的数量。从用户输入读取每棵桃树上的蟠桃数量,并检查是否满足条件(数量大于 0),如果不满足则输出 0 并返回。
再从用户输入获取守卫离开的时间h,如果h不满足条件(0 < h < 10000),则输出 0 并返回。 - 调用函数并输出结果:
调用findMinEatingSpeed函数,并将结果输出到控制台。