不要问我为什么选这道题,每天就是打开页面随便选一道。
问题描述
小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;
}
秒了。