华为OD机试真题 新系统2026-04-22 C++Java实现【计费时段计算】

发布时间:2026/5/16 1:02:04

华为OD机试真题 新系统2026-04-22 C++Java实现【计费时段计算】 计费时段计算华为OD机试 新系统真题 华为OD上机考试 新系统真题 4月22号 100分题型华为OD机试新系统真题目录包含C/C/Py/Java/Js/Go题解: 华为OD机试真题题库目录机考题库 算法考点详解题目描述电力公司的电费根据用电的时间采用三挡计费第一档用电时间在每天的12:00-13:30和17:30-18:00第二档每天从0:00起的且不在第一档时段内的累积的10小时第三档其他时段某设备每天开关机一次0:00之前必然关机。统计这台设备每天各个时段的开机时长用分钟表示。时间格式HH:MM24小时制 说明小时不足两位不补零分钟严格保持两位。例如8:08输入描述“HH:MM HH:MM”两个时间分别为设备开机时间、设备关机时间中间空格间隔。例如“8:00 23:30”。约束:结束时间不超过0:00最大为23:59即不考虑跨天的情况。如果开机时间跟关机时间相等则认为是开机0分钟。例如“8:00 8:00”输出描述依次为第一、二、三档的时长,单位分钟用例1输入8:00 23:30输出120,600,210说明第一档12:00-13:30、17:30-18:00共120分钟第二档8:00-12:00、13:30-17:30、18:00-20:00共600分钟达到10小时上限。其余的时间要归到第三档第三档20:00-23:30共210分钟用例2输入13:00 17:45输出45,240,0说明第一档13:00-13:30、17:30-17:45共45分钟第二档13:30-17:30共240分钟第三档由于第二档还没达到10小时第三档时间为0思路思路模拟首先将开始时间和结束时间以及题目要求的第一档时间补全转换为分钟表示。总用电时间为total end - time, 如果total 0则直接返回[0,0,0]即可对于第一档时间主要看用电时间为12:00-13:30和17:30-18:00交集两个时间段存在交集的有个公式,例如{start1, end1}, {start2, end2}的存在交集的情况为min(end1, end2) - max(start1, start2) 0其交集时间大小就为上述计算公式计算结果。利用这个可以求出第一档所用时间。第二档所用时间为min(total - 第一档时间, 10 * 60)第三档所用时间为total - 第一档时间 - 第二档时间按照3 、4、5的逻辑计算出第一档、第二档、第三档时间之后返回即可。代码实现C#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vectorstring split(const string str, const string delimiter) { vectorstring result; size_t start 0; size_t end str.find(delimiter); while (end ! string::npos) { result.push_back(str.substr(start, end - start)); start end delimiter.length(); end str.find(delimiter, start); } // 添加最后一个部分 result.push_back(str.substr(start)); return result; } // 同一使用分钟表示 int getTimeInt(string time) { vectorstring timeSplit split(time, :); int res 0; res stoi(timeSplit[0]) * 60 stoi(timeSplit[1]); return res; } vectorint calBilling(string startEnd) { vectorint res(3, 0); vectorstring timeSplit split(startEnd, ); string start timeSplit[0]; string end timeSplit[1]; int startTimeMinute getTimeInt(start); int endTimeMinute getTimeInt(end); // 结果都为0直接返回 if (endTimeMinute startTimeMinute ) { return res; } int totalTime endTimeMinute - startTimeMinute; // 计算第一档交集 if (min(endTimeMinute, getTimeInt(13:30)) - max(startTimeMinute, getTimeInt(12:00)) 0) { res[0] min(endTimeMinute, getTimeInt(13:30)) - max(startTimeMinute, getTimeInt(12:00)); } if (min(endTimeMinute, getTimeInt(18:00)) - max(startTimeMinute, getTimeInt(17:30)) 0) { res[0] min(endTimeMinute, getTimeInt(18:00)) - max(startTimeMinute, getTimeInt(17:30)); } // 剩余总时间减去第一档 totalTime - res[0]; if (totalTime 0) { return res; } // 第二档 res[1] min(totalTime, 10 * 60); totalTime - res[1]; //第三档为剩余时间 res[2] totalTime; return res; } int main() { string input; getline(cin, input); vectorint res calBilling(input); // 输出结果 for (int i 0; i 3; i) { cout res[i]; if (i ! 2) { cout ,; } } return 0; }Javaimportjava.util.*;publicclassMain{// 时间转分钟publicstaticintgetTimeInt(Stringtime){String[]partstime.split(:);returnInteger.parseInt(parts[0])*60Integer.parseInt(parts[1]);}publicstaticint[]calBilling(StringstartEnd){int[]resnewint[3];String[]timeSplitstartEnd.split( );StringstarttimeSplit[0];StringendtimeSplit[1];intstartTimegetTimeInt(start);intendTimegetTimeInt(end);// 无时间if(startTimeendTime)returnres;inttotalTimeendTime-startTime;// 第一档区间 12:00 - 13:30intl1Math.max(startTime,getTimeInt(12:00));intr1Math.min(endTime,getTimeInt(13:30));if(r1l1)res[0](r1-l1);// 第一档区间 17:30 - 18:00intl2Math.max(startTime,getTimeInt(17:30));intr2Math.min(endTime,getTimeInt(18:00));if(r2l2)res[0](r2-l2);totalTime-res[0];if(totalTime0)returnres;// 第二档res[1]Math.min(totalTime,10*60);totalTime-res[1];// 第三档res[2]totalTime;returnres;}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);Stringinputsc.nextLine();int[]rescalBilling(input);System.out.println(res[0],res[1],res[2]);}}更多编程语言题解可以点击跳转查看计费时段计算(C/C/Py/Java/Js/Go)题解可点击查看

相关新闻