计费时段计算2026 华为OD机试真题 4月22日华为OD上机新系统考试真题 100 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述电力公司的电费根据用电的时间采用三挡计费第一档用电时间在每天的12 : 00 12:0012:00-13 : 30 13:3013:30和17 : 30 17:3017:30-18 : 00 18:0018:00第二档每天从0 : 00 0:000:00起的且不在第一档时段内的累积的10 1010小时第三档其他时段某设备每天开关机一次0 : 00 0:000:00之前必然关机。统计这台设备每天各个时段的开机时长用分钟表示。时间格式H H : M M HH:MMHH:MM24 2424小时制 说明小时不足两位不补零分钟严格保持两位。例如8 : 08 8:088:08输入描述“H H : M M HH:MMHH:MMH H : M M HH:MMHH:MM”两个时间分别为设备开机时间、设备关机时间中间空格间隔。例如“8 : 00 8:008:0023 : 30 23:3023:30”。约束结束时间不超过0 : 00 0:000:00最大为23 : 59 23:5923:59即不考虑跨天的情况。如果开机时间跟关机时间相等则认为是开机0 00分钟。例如“8 : 00 8:008:008 : 00 8:008:00”输出描述整数数组依次为第一、二、三档的时长单位分钟。例如[ 120 , 600 , 210 ] [120,600,210][120,600,210]示例1输入8:00 23:30输出[120,600,210]说明第一档12 : 00 12:0012:00-13 : 30 13:3013:30、17 : 30 17:3017:30-18 : 00 18:0018:00共120 120120分钟第二档8 : 00 8:008:00-12 : 00 12:0012:00、13 : 30 13:3013:30-17 : 30 17:3017:30、18 : 00 18:0018:00-20 : 00 20:0020:00共600 600600分钟达到10 1010小时上限。其余的时间要归到第三档第三档20 : 00 20:0020:00-23 : 30 23:3023:30共210 210210分钟示例2输入13:00 17:45输出[45,240,0]说明第一档13 : 00 13:0013:00-13 : 30 13:3013:30、17 : 30 17:3017:30-17 : 45 17:4517:45共45 4545分钟第二档13 : 30 13:3013:30-17 : 30 17:3017:30共240 240240分钟第三档由于第二档还没达到10 1010小时第三档时间为0 00解题思路核心思想时间转换将所有输入的时间格式HH:MM转换为从当天0 : 00 0:000:00开始的总分钟数方便计算。档位规则第一档固定时段12 : 00 12:0012:00-13 : 30 13:3013:30720 720720-810 810810分钟和17 : 30 17:3017:30-18 : 00 18:0018:001050 10501050-1080 10801080分钟。第二档非第一档时段内的开机时间每天累积上限为10 1010小时600 600600分钟。第三档超过第二档上限后的所有其他开机时间。模拟计算从开机时间遍历到关机时间每一分钟判断其属于哪一档如果当前分钟在第一档时段内计入第一档。如果不在第一档时段如果已计入第二档的时间未满600 600600分钟计入第二档。否则计入第三档。输出结果以数组形式输出三个档位的总时长。复杂度分析时间复杂度O ( L ) O(L)O(L)其中L LL是开关机之间的时间跨度分钟。由于一天最多只有1440 14401440分钟因此计算非常高效。空间复杂度O ( 1 ) O(1)O(1)只需要常数级别的变量来存储各档位的时间。Javaimportjava.util.Scanner;/** * 华为OD机试 - 计费时段计算 */publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);if(!sc.hasNext())return;// 读取开机和关机时间StringstartStrsc.next();StringendStrsc.next();intstarttoMinutes(startStr);intendtoMinutes(endStr);inttier10;inttier20;inttier30;inttier2Limit600;// 第二档上限 600 分钟// 逐分钟进行模拟计算for(intistart;iend;i){if(isTier1(i)){tier1;}else{if(tier2tier2Limit){tier2;}else{tier3;}}}// 输出结果格式 [T1, T2, T3]System.out.println([tier1,tier2,tier3]);}/** * 将 HH:MM 格式转换为总分钟数 */privatestaticinttoMinutes(Stringtime){String[]partstime.split(:);returnInteger.parseInt(parts[0])*60Integer.parseInt(parts[1]);}/** * 判断当前分钟是否属于第一档时段 * 第一档12:00-13:30 (720-810) 和 17:30-18:00 (1050-1080) */privatestaticbooleanisTier1(intm){return(m720m810)||(m1050m1080);}}Pythonimportsysdefto_minutes(t_str):将 HH:MM 转换为分钟h,mmap(int,t_str.split(:))returnh*60mdefis_tier1(m):判断是否为第一档时段# 12:00-13:30 (720-810), 17:30-18:00 (1050-1080)return(720m810)or(1050m1080)defsolve():# 读取输入linesys.stdin.read().strip()ifnotline:returntimesline.split()iflen(times)2:returnstartto_minutes(times[0])endto_minutes(times[1])t1,t2,t30,0,0t2_limit600# 模拟每一分钟forminrange(start,end):ifis_tier1(m):t11else:ift2t2_limit:t21else:t31# 格式化输出print(f[{t1},{t2},{t3}])if__name____main__:solve()JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,terminal:false});rl.on(line,(line){if(!line.trim())return;constpartsline.trim().split(/\s/);if(parts.length2)return;consttoMinutes(t){const[h,m]t.split(:).map(Number);returnh*60m;};conststarttoMinutes(parts[0]);constendtoMinutes(parts[1]);lett10,t20,t30;constt2Limit600;// 逐分钟判断for(letmstart;mend;m){// 第一档判断if((m720m810)||(m1050m1080)){t1;}else{// 第二、三档判断if(t2t2Limit){t2;}else{t3;}}}console.log([${t1},${t2},${t3}]);});C#includeiostream#includestring#includevector#includesstreamusingnamespacestd;/** * 将 HH:MM 格式的时间转换为分钟 */inttoMinutes(string t){inth,m;sscanf(t.c_str(),%d:%d,h,m);returnh*60m;}/** * 判断是否属于第一档 */boolisTier1(intm){return(m720m810)||(m1050m1080);}intmain(){string s1,s2;if(!(cins1s2))return0;intstarttoMinutes(s1);intendtoMinutes(s2);intt10,t20,t30;intt2Limit600;// 模拟计算for(intistart;iend;i){if(isTier1(i)){t1;}else{if(t2t2Limit){t2;}else{t3;}}}cout[t1,t2,t3]endl;return0;}Gopackagemainimport(fmtstrings)// 将 HH:MM 转换为分钟functoMinutes(tstring)int{varh,mintfmt.Sscanf(t,%d:%d,h,m)returnh*60m}funcmain(){vars1,s2string// 读取两个时间字符串if_,err:fmt.Scan(s1,s2);err!nil{return}start:toMinutes(s1)end:toMinutes(s2)t1,t2,t3:0,0,0t2Limit:600// 逐分钟计费fori:start;iend;i{// 判断是否在第一档时段if(i720i810)||(i1050i1080){t1}else{// 第二档和第三档ift2t2Limit{t2}else{t3}}}// 按照 [T1,T2,T3] 格式输出fmt.Printf([%d,%d,%d]\n,t1,t2,t3)}C语言#includestdio.h/** * 将时间字符串 HH:MM 转换为总分钟数 */intto_minutes(char*t){inth,m;sscanf(t,%d:%d,h,m);returnh*60m;}intmain(){chars1[10],s2[10];// 读取开机和关机时间if(scanf(%s %s,s1,s2)!2)return0;intstartto_minutes(s1);intendto_minutes(s2);intt10,t20,t30;intt2_limit600;// 逐分钟累加计费时长for(intistart;iend;i){// 第一档时段判断if((i720i810)||(i1050i1080)){t1;}else{// 第二档及第三档判断if(t2t2_limit){t2;}else{t3;}}}// 打印结果printf([%d,%d,%d]\n,t1,t2,t3);return0;}完整用例用例18:00 23:30用例213:00 17:45用例312:00 13:30用例40:00 10:00用例512:00 12:00用例620:00 23:59用例711:59 12:01用例817:29 18:01用例90:00 23:59用例1013:30 17:30文章目录计费时段计算题目描述输入描述输出描述示例1示例2解题思路核心思想复杂度分析JavaPythonJavaScriptCGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10