华为机考真题 -- 孙悟空爱吃蟠桃

题目描述:

孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值