首页 > 代码库 > poj1064 cable master(最大值问题:二分+贪心)
poj1064 cable master(最大值问题:二分+贪心)
题意:
有n条电缆,他们的长度分别为l[i]。如果从n条电缆中切割出K条长度相同的电缆的话,这k条电缆每条最长能多长?答案小数点后保留两位有效数字。
输入:
n, k
n行:l[i]
Sample Input
4 11
8.02
7.43
4.57
5.39
Sample Output
2.00
数据范围:
1<=N<=10000;
1<=k<=10000;
1<=l[i]<=100000。
分析:
设命题:can(x)=能切割出k条长度为x的电缆。
问题转化:求can(x)成立的最大的x。
提示:为了避免实数运算误差,把电缆长度放大100倍,化为整数,最后不要忘了把结果再除以100即可。
1 const 2 maxn=10000; 3 var 4 a:array[1..maxn] of longint; 5 n,k:longint; 6 procedure init; 7 var i:longint; x:real; 8 begin 9 assign(input,‘poj1064.in‘); reset(input);10 readln(n,k);11 for i:=1 to n do12 begin13 readln(x);14 a[i]:=trunc(x*100);15 end;16 close(input);17 end;18 function can(x:longint):boolean;19 var s,i:longint;20 begin21 s:=0;22 for i:=1 to n do23 s:=s+a[i] div x;24 exit(s>=k);25 end;26 function find:longint;27 var l,r,mid:longint;28 begin29 l:=0; r:=10000000;30 while l<r do31 begin32 mid:=(l+r+1) div 2;33 if can(mid) then l:=mid //还可能再加长34 else r:=mid-1; // 过长无法切割k份,需缩短35 end;36 exit(l);37 end;38 begin39 init;40 writeln(find/100.0:0:2);41 end.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。