算法练手题目:Cable master
题目是英文我就不放原题了简单几句概括现在需要准备很多等长的网线小段。现在从供应商那里买了一堆网线每根网线长度不同可以按 1 厘米精度切割但不能拼接只能切从这些线里切出 K 段完全相同长度的网线并且希望这些小段尽可能长输入第一行N KN有多少根电缆1 ≤ N ≤ 10000K需要切出的段数1 ≤ K ≤ 10000接下来 N 行每行一个电缆长度单位米精确到小数点后两位厘米级精度范围1 m ~ 100000 m输出可以切出的 最大等长网线长度米要求精确到小数点后两位如果连 1 cm 都切不出 K 段则为0.00这是最大最小二分小数二分求最大值的话右缩板子的话看老师ppt下面是我根据板子写的一次booljudge(doublex){intcnt0;for(inti0;in;i){cnt(int)(a[i]/x);}returncntK;}doublesolve(){doublel0,rmaxLen;// 最大绳子长度constdoubleeps1e-7;while(r-leps){doublemid(lr)/2;if(judge(mid)){lmid;// 可以切够 → 尝试更长}else{rmid;// 不够 → 缩短}}returnl;}这是最核心的两个方法下面是完整的#includeiostream#includeiomanipusingnamespacestd;constintMAXN10010;intn,k;intlen[MAXN];// 单位cmbooljudge(intx){if(x0)returntrue;intcnt0;for(inti0;in;i){cntlen[i]/x;}returncntk;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);cinnk;intmaxLen0;for(inti0;in;i){doublex;cinx;len[i](int)(x*1000.5);// 转 cmif(len[i]maxLen)maxLenlen[i];}intl1,rmaxLen;intans0;while(lr){intmid(lr)/2;if(judge(mid)){ansmid;lmid1;}else{rmid-1;}}if(ans0){cout0.00\n;}else{coutfixedsetprecision(2)ans/100.0\n;}return0;}