第455题-最短评估时间问题 | 豆包MarsCode AI刷题

71 阅读2分钟

不要问我为什么选这道题,每天就是打开页面随便选一道。

问题描述

小R在教室里有N名学生和M名教职员工。每个教职员工的评估速度不同,评估每个学生所需的时间不同。你得到一个数组A,其中A[i]表示第i名教职员工对一名学生进行评估所需的时间(以分钟为单位)。

教职员工需要对所有学生进行评估,每名教职员工在任意时刻只能评估一名学生。评估完成后,教职员工可以立即开始评估下一名学生。你的任务是找到在这些条件下评估所有学生所需的最短总时间。


测试样例

样例1:

输入:N = 2, M = 2, A = [3, 4]
输出:4

样例2:

输入:N = 3, M = 2, A = [5, 7]
输出:10

样例3:

输入:N = 5, M = 3, A = [2, 3, 5]
输出:6

这道题目看上去像一个规划问题,给定不同老师的阅卷速度,看怎样规划能让工作时间最短。但实际上,哪里有什么要规划的地方,最正确的策略当然是资本家策略,谁也不许停下来干活,干完为止。

既然如此,只要时间是给定的,每个人能干多少,总共能做多少工作就是确定的了。那这个最小的时间要怎么找呢?比它高就一定能做完,比它低就一定做不完,听上去已经有门路了,二分就可以了。

#include <iostream>
#include <vector>

bool judge(int time, int N, const std::vector<int>& A){
    int cnt = 0;
    for(auto x : A) cnt += time / x;
    return cnt >= N;
}

int solution(int N, int M, const std::vector<int>& A) {
    int l = 0, r = 10000000;
    while(l != r){
        int mid = (l + r) / 2;
        if(judge(mid, N, A)) r = mid;
        else l = mid + 1;
    }
    return l;
}

int main() {
    std::cout << (solution(2, 2, {3, 4}) == 4) << std::endl;
    std::cout << (solution(3, 2, {5, 7}) == 10) << std::endl;
    std::cout << (solution(5, 3, {2, 3, 5}) == 6) << std::endl;
}

秒了。