题目
部门在进行需求开发时需要进行人力安排。当前部门需要完成N个需求,需求用requirements[]表示,requirements[i]表示第i个需求的工作量大小,单位:人月。
这部分需求需要在M个月内完成开发,进行人力安排后每个月的人力是固定的。
目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下,
每个月需要的最小人力是多少?
输入描述
输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度,
- 1 ≤ N/2 ≤ M ≤ N ≤ 10000
- 1 ≤ requirements[i] ≤ 10^9
输出描述
对于每一组测试数据,输出部门需要人力需求,行末无多余的空格
用例
输入
3
3 5 3 4
输出
6
注意:输入数据两行, 第一行输入数据3表示开发时间要求, 第二行输入数据表示需求工作量大小, 输出数据一行,表示部门人力需求。 当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。 当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。 因此6是部门最小的人力需求。
#include <stdio.h>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <algorithm>
#include <math.h>
using namespace std;
int MatchMinWorker(int requirement[],int iWorkCount,int iWorkTime)
{
if (iWorkCount < 1 || iWorkTime < ((iWorkCount + 1) / 2))
{
//数据不合法或者无法完成
return -1;
}
int iworkMin(0);
sort(requirement,requirement+iWorkCount);
iworkMin = requirement[iWorkCount -1];
int iDoubleWorkTime = iWorkCount - iWorkTime;
if (iDoubleWorkTime > 0)
{
int iLoopMax = iDoubleWorkTime * 2;
int iDoubleWorkMax = 0;
for (int iMin = 0,iMax = iLoopMax - 1; iMin < iDoubleWorkTime;)
{
iMin++;
iMax--;
iDoubleWorkMax = max(iDoubleWorkMax,requirement[iMin] + requirement[iMax]);
}
if (iDoubleWorkMax > iworkMin)
{
iworkMin = iDoubleWorkMax;
}
}
return iworkMin;
}
int main()
{
int work[] = {3,5,4,4,8 ,9,8,8,7,5,4,3,8,7,10};
int iMonth = 10;
int iRet = MatchMinWorker(work,15,iMonth);
return 0;
}