2026/4/16 20:29:17
网站建设
项目流程
网站建设策划书选题,wordpress自定义简码,无锡电子商务网站建设公司,外包加工拿货网部门人力分配 2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录#xff5c;机考题库 算法考点详解
题目描述
部门在进行需求开发时需要进行人力安排。
当前部门需要完成 N 个需求机考题库 算法考点详解题目描述部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求需求用 requirements 表述requirements[i] 表示第 i 个需求的工作量大小单位人月。这部分需求需要在 M 个月内完成开发进行人力安排后每个月人力时固定的。目前要求每个月最多有2个需求开发并且每个月需要完成的需求不能超过部门人力。请帮助部门评估在满足需求开发进度的情况下每个月需要的最小人力是多少输入描述输入为 M 和 requirementsM 表示需求开发时间要求requirements 表示每个需求工作量大小N 为 requirements长度1 ≤ N/2 ≤ M ≤ N ≤ 100001 ≤ requirements[i] ≤ 10^9输出描述对于每一组测试数据输出部门需要人力需求行末无多余的空格用例1输入3 3 5 3 4输出6说明输入数据两行第一行输入数据3表示开发时间要求第二行输入数据表示需求工作量大小输出数据一行表示部门人力需求。当选择人力为6时2个需求量为3的工作可以在1个月里完成其他2个工作各需要1个月完成。可以在3个月内完成所有需求。当选择人力为5时4个工作各需要1个月完成一共需要4个月才能完成所有需求。因此6是部门最小的人力需求。题解思路二分 双指针比较经典的二分题型一般这种在满足什么条件下求最小/最大是比较典型的二分特征题。首先确认上下边界注意题目限制1 ≤ N/2 ≤ M其实是已经限制了题目肯定有解。left 最大要求天数需求由需要完成的需求不能超过部门人力决定确定了边界。right 最大要求天数需求 次打要求天数需求由需要完成的需求不能超过部门人力和每个月最多有2个需求开发共同确定。确定上下边界之后就是枚举找到满足条件的最小部门人数值每次枚举mid (left right) /2,判断是否可以在m个月完成然后收缩边界,直到left right结束:不能在m个月完成移动left mid 1能在m个月满足,移动right mid判断是否能在m个月判断采用双指针进行处理这里要处理的问题其实在指定人数下完成这些任务需要的月数并且一个月最多完成两个任务为了减少月数尽量是让每个月完成两个任务。所以采用下面的逻辑尽量让最小和最大组合先将requirements升序排序指针l 0, r requirements.size()如果requirements[l] requirements[r] mid: 进行l,r --处理,需要处理月份1否则贪心处理任务量大的,r--需要处理月份1执行1 2逻辑直到l r结束判断需要月份是否小于m二分结束之后left 或者right就是结果。额外注意由于1≤ requirements[i] ≤ 10^9在计算过程使用int会造成移除改使用long对于js推荐使用BigInt处理。c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vectorint split(const string str, const string delimiter) { vectorint result; size_t start 0; size_t end str.find(delimiter); while (end ! string::npos) { result.push_back(stoi(str.substr(start, end - start))); start end delimiter.length(); end str.find(delimiter, start); } // 添加最后一个部分 result.push_back(stoi(str.substr(start))); return result; } bool check(vectorint requirements, int personCount, int m) { long needMonth 0; int l 0, r requirements.size() -1; // 双指针求最小月数 while (l r) { if (l r) { needMonth; r--; continue; } long actualPeronCount requirements[l] requirements[r]; // 一同处理 if (actualPeronCount personCount) { l; r--; // 选择消耗工作量大的 } else { r--; } needMonth; } return needMonth m; } int main() { int m; cin m; string input; // 忽略空行 cin.ignore(); getline(cin, input); vectorint requirements split(input, ); int n requirements.size(); sort(requirements.begin(), requirements.end()); // 每个月需要完成的需求不能超过部门人力决定必须满足单个需求可以在一个月完成 long left requirements[n-1]; // 单月最多两个需求限制了最大人数 long right requirements[n-1] requirements[n - 2]; // 二分 while (left right) { long mid (left right) 1; if (check(requirements, mid, m)) { right mid; } else { left mid 1; } } cout left; return 0; }JAVAimport java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { // 判断在 personCount 人力下是否能在 m 个月内完成 static boolean check(ListInteger requirements, long personCount, int m) { long needMonth 0; int l 0, r requirements.size() - 1; // 双指针求最小月数 while (l r) { if (l r) { needMonth; r--; continue; } long actualPersonCount requirements.get(l) requirements.get(r); // 一同处理 if (actualPersonCount personCount) { l; r--; } else { // 只能处理大的那个 r--; } needMonth; } return needMonth m; } public static void main(String[] args) throws Exception { BufferedReader br new BufferedReader(new InputStreamReader(System.in)); int m Integer.parseInt(br.readLine()); String[] parts br.readLine().trim().split(\\s); ListInteger requirements new ArrayList(); for (String p : parts) { requirements.add(Integer.parseInt(p)); } Collections.sort(requirements); int n requirements.size(); // 单个需求必须能在一个月完成 long left requirements.get(n - 1); // 单月最多两个需求 long right requirements.get(n - 1) requirements.get(n - 2); // 二分查找 while (left right) { long mid (left right) 1; if (check(requirements, mid, m)) { right mid; } else { left mid 1; } } System.out.println(left); } }Pythondefcheck(requirements,person_count,m):need_month0l,r0,len(requirements)-1# 双指针求最小月数whilelr:iflr:need_month1r-1continueactual_person_countrequirements[l]requirements[r]# 一同处理ifactual_person_countperson_count:l1r-1else:# 只能处理大的那个r-1need_month1returnneed_monthm mint(input())requirementslist(map(int,input().split()))requirements.sort()nlen(requirements)# 单个需求必须能在一个月完成leftrequirements[-1]# 单月最多两个需求rightrequirements[-1]requirements[-2]# 二分查找whileleftright:mid(leftright)//2ifcheck(requirements,mid,m):rightmidelse:leftmid1print(left)JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});letlines[];rl.on(line,line{lines.push(line.trim());});rl.on(close,(){constmBigInt(lines[0]);constrequirementslines[1].split(/\s/).map(BigInt);requirements.sort((a,b)(ab?-1:1));functioncheck(personCount){letneedMonth0n;letl0,rrequirements.length-1;while(lr){if(lr){needMonth;r--;continue;}constactualPersonCountrequirements[l]requirements[r];if(actualPersonCountpersonCount){l;r--;}else{r--;}needMonth;}returnneedMonthm;}letleftrequirements[requirements.length-1];letrightrequirements[requirements.length-1]requirements[requirements.length-2];// BigInt 二分while(leftright){constmid(leftright)/2n;if(check(mid)){rightmid;}else{leftmid1n;}}console.log(left.toString());});Gopackagemainimport(bufiofmtossort)funccheck(requirements[]int,personCountint64,mint)bool{varneedMonthint640l,r:0,len(requirements)-1// 双指针求最小月数forlr{iflr{needMonthr--continue}actualPersonCount:int64(requirements[l]requirements[r])// 一同处理ifactualPersonCountpersonCount{lr--}else{// 只能处理大的那个r--}needMonth}returnneedMonthint64(m)}funcmain(){in:bufio.NewReader(os.Stdin)varmintfmt.Fscanln(in,m)varrequirements[]intfor{varxint_,err:fmt.Fscan(in,x)iferr!nil{break}requirementsappend(requirements,x)}sort.Ints(requirements)n:len(requirements)// 单个需求必须能在一个月完成left:int64(requirements[n-1])// 单月最多两个需求right:int64(requirements[n-1]requirements[n-2])// 二分查找forleftright{mid:(leftright)1ifcheck(requirements,mid,m){rightmid}else{leftmid1}}fmt.Println(left)}