
最优河堤加固方案(C/Py/Java/Js/Go)题解华为笔试真题 7月24号 非AI方向第一题 100分题型题目内容一个数组代表河堤的高度堤坝是等长、等宽的现在需要在不超过最大预算的前提下尽可能的加固河堤使最低高度所有加固的土只能通过一定的成本来运输和填充。一辆车一次只能运输一定量的土运输成本每次固定一车土可以填入多个堤坝填埋每个单位成本固定。求出在不超过给定预算成本的情况下填埋后的所有河堤岸最低高度的最大值是多少。输入描述最大预算成本MaxCosts(1≤MaxCosts≤1000 0000 0000)\left(1 \le MaxCosts \le 1000\,0000\,0000\right)(1≤MaxCosts≤100000000000)每车最大载量MaxCapacity(1≤MaxCapacity≤100)\left(1 \le MaxCapacity \le 100\right)(1≤MaxCapacity≤100)每车单次运输成本TransportationCostPerShipment(1≤TransportationCostPerShipment≤100)\left(1 \le TransportationCostPerShipment \le 100\right)(1≤TransportationCostPerShipment≤100)每个单位高度的土填埋成本UnitCost(1≤UnitCost≤100)\left(1 \le UnitCost \le 100\right)(1≤UnitCost≤100)河堤个数num(1≤num≤100000)\left(1 \le num \le 100000\right)(1≤num≤100000)河堤高度数据heights[]空格分割数据个数为num。(0≤heights[i]≤1000000)\left(0 \le heights[i] \le 1000000\right)(0≤heights[i]≤1000000)输出描述预算成本内可以加固的最低高度最大值。注意可提高预算情况下最大值会超过加固前河堤最大高度。样例1输入100 10 5 2 5 1 2 5 3 4输出11解释最大预算成本100每车最大载量10单次运输成本为5每个单位高度的土填埋成本是2河堤线长度是5。最优方案是成本内所有河堤最低高度加固到11总共土填埋成本为(11−111−211−511−311−4)∗280(11-1 11-2 11-5 11-3 11-4) * 280(11−111−211−511−311−4)∗280运输成本是需要4辆车拉取40个单位的土运输成本为20共计花费100不超过最大预算成本。如果所有河堤最低高度加固到12总共土填埋成本为(12−112−212−512−312−4)∗290(12-1 12-2 12-5 12-3 12-4) * 290(12−112−212−512−312−4)∗290。运输成本是需要5辆车拉取45个单位的土运输成本为25共计花费115超过最大预算成本。样例2输入50 10 10 1 10 1 2 5 3 4 5 4 1 1 1输出4解释最大预算成本50每车最大载量10单次运输成本为10每个单位高度的土填埋成本是1河堤线长度是10。最优方案是成本内所有河堤最低高度加固到4总共土填埋成本为(4−14−24−34−14−14−1)∗115(4-1 4-2 4-3 4-1 4-1 4-1) * 115(4−14−24−34−14−14−1)∗115运输成本是需要2辆车拉取15个单位的土运输成本为20共计花费35不超过最大预算成本。如果所有河堤最低高度加固到5总共土填埋成本为(5−15−25−35−45−45−15−15−1)∗123(5-1 5-2 5-3 5-4 5-4 5-1 5-1 5-1) * 123(5−15−25−35−45−45−15−15−1)∗123运输成本是需要3辆车拉取23个单位的土运输成本为30共计花费53超过最大预算成本。题解和思路思路实现思路二分标准二分题型开始确定左右边界left 0, right 1e9足够大枚举中间值mdi (l r 1) /2作为河堤岸最低高度判断是否能在不超过最大成本前提下完成能完成更新l mid不能完成更新r mid - 1check逻辑统计需要填充高度数量并判断 填充成本 运输成本 最大预算成本算法总体时间复杂度为O(nlogn)C#includebits/stdc.husingnamespacestd;intmaxCosts,maxCapacity,T,U,n;vectorintheights;boolcheck(intmid){// 填充土的数量longres0;for(autoheight:heights){if(heightmid){resmid-height;}}// 成本 单位填充 运输成本returnres*U(resmaxCapacity-1)/maxCapacity*TmaxCosts;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);cinmaxCosts;cinmaxCapacity;cinT;cinU;cinn;heights.resize(n);for(inti0;in;i){cinheights[i];}intl0,r1e9;// 二分while(lr){intmid(lr1)1;if(check(mid)){lmid;}else{rmid-1;}}coutl;return0;}Javaimportjava.util.*;publicclassMain{staticlongmaxCosts,maxCapacity,T,U;staticintn;staticint[]heights;staticbooleancheck(longmid){// 填充土的数量longres0;for(intheight:heights){if(heightmid){resmid-height;}}// 成本 单位填充成本 运输成本returnres*U((resmaxCapacity-1)/maxCapacity)*TmaxCosts;}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);maxCostssc.nextLong();maxCapacitysc.nextLong();Tsc.nextLong();Usc.nextLong();nsc.nextInt();heightsnewint[n];for(inti0;in;i){heights[i]sc.nextInt();}longl0,r1000000000L;// 二分while(lr){longmid(lr1)1;if(check(mid)){lmid;}else{rmid-1;}}System.out.print(l);}}pythonmaxCostsint(input())maxCapacityint(input())Tint(input())Uint(input())nint(input())heightslist(map(int,input().split()))defcheck(mid):# 填充土的数量res0forheightinheights:ifheightmid:resmid-height# 成本 单位填充成本 运输成本returnres*U((resmaxCapacity-1)//maxCapacity)*TmaxCosts l,r0,10**9# 二分whilelr:mid(lr1)//2ifcheck(mid):lmidelse:rmid-1print(l)Javascriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});constinput[];rl.on(line,(line){input.push(line);});rl.on(close,(){letidx0;constmaxCostsBigInt(input[idx]);constmaxCapacityBigInt(input[idx]);constTBigInt(input[idx]);constUBigInt(input[idx]);constnNumber(input[idx]);constheightsinput[idx].split( ).map(Number);functioncheck(mid){// 填充土的数量letres0n;for(constheightofheights){if(BigInt(height)mid){resmid-BigInt(height);}}// 成本 单位填充成本 运输成本returnres*U((resmaxCapacity-1n)/maxCapacity)*TmaxCosts;}letl0n;letr1000000000n;// 二分while(lr){constmid(lr1n)1n;if(check(mid)){lmid;}else{rmid-1n;}}console.log(l.toString());});Gopackagemainimport(bufiofmtos)var(maxCostsint64maxCapacityint64Tint64Uint64nintheights[]int64)funccheck(midint64)bool{// 填充土的数量varresint640for_,height:rangeheights{ifheightmid{resmid-height}}// 成本 单位填充成本 运输成本returnres*U(resmaxCapacity-1)/maxCapacity*TmaxCosts}funcmain(){in:bufio.NewReader(os.Stdin)fmt.Fscan(in,maxCosts)fmt.Fscan(in,maxCapacity)fmt.Fscan(in,T)fmt.Fscan(in,U)fmt.Fscan(in,n)heightsmake([]int64,n)fori:0;in;i{fmt.Fscan(in,heights[i])}varlint640varrint641000000000// 二分forlr{mid:(lr1)1ifcheck(mid){lmid}else{rmid-1}}fmt.Print(l)}