题目描述:
部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求,需求用requirements[]表示,requirements[i]表示第 i 个需求的工作量大小,单位:人月。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月的人力是固定的。
目前要求每个月最多有 2 个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?
输入描述:
第一行为 M 和 requirements,M 表示需要开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements 长度,其中:
1 <= N/2 <= M <= N <= 10^4
1 <= requirements[i] <= 10^9
输出描述:
对于每一组测试数据,输出部门需要人力需求,行末无多余空格
示例1:
输入
3
3 5 3 4
输出
6
说明:输入两行数据,
第一行输入数据 3 表示开发时间要求,
第二行输入数据表示需求工作量大小,输出数据一行,表示部门人力需求
C++源码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <string>
#include <sstream>
using namespace std;
int countHumanSource(int M, vector<int>& requirements) {
// 将工作量列表进行升序排序,便于后续处理
//sort(lis.begin(), lis.end());
// 设置二分搜索的左边界为列表中的最大值,因为这是完成所有任务的最小可能人力
int req = requirements.back();
// 设置二分搜索的右边界为2*10^9,这是题目约定的人力上限
int limitHuman = 2000000000;
// 初始化答案变量为人力上限
int humanNum = limitHuman;
// 进行二分搜索,寻找最小满足条件的人力配置
while (req <= limitHuman) {
int mid = (req + limitHuman) / 2;
vector<int> tmp = requirements;
int tim = 0;
while (!tmp.empty()) {
tim++;
int b = tmp.back();
tmp.pop_back();
if (!tmp.empty()) {
int p = -1;
for (int i = 0; i < tmp.size(); ++i) {
if (tmp[i] + b <= mid) {
p = i;
break;
}
}
if (p != -1) {
tmp.erase(tmp.begin() + p);
}
}
}
if (tim <= M) {
humanNum = mid;
limitHuman = mid - 1;
}
else {
req = mid + 1;
}
}
return humanNum;
}
int main() {
// 读取允许的最大月数 M
int M;
cin >> M;
// 读取每个需求的工作量列表,并转换为整数列表
vector<int> requirements;
int temp;
while (cin >> temp) {
requirements.push_back(temp);
if (cin.get() == '\n') {
break;
}
}
// 将工作量列表进行升序排序,便于后续处理
sort(requirements.begin(), requirements.end());
int humanNums = countHumanSource(M, requirements);
// 调用solve函数并输出结果
cout << humanNums << endl;
system("pause");
return 0;
}