• 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 do
    12         begin
    13           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     begin
    21       s:=0;
    22       for i:=1 to n do
    23         s:=s+a[i] div x;
    24       exit(s>=k);
    25     end;
    26   function find:longint;
    27     var l,r,mid:longint;
    28     begin
    29       l:=0; r:=10000000;
    30       while l<r do
    31         begin
    32           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 begin
    39   init;
    40   writeln(find/100.0:0:2);
    41 end.
    View Code
  • 相关阅读:
    网站抓取
    Java经典类库-Guava中的函数式编程讲解
    更快的memcpy
    Jqgrid入门-使用模态对话框编辑表格数据(三)
    深入理解.NET程序的原理 谈一谈破解.NET软件的工具和方法
    jquery跨域请求数据
    C#WebBrowser控件使用教程与技巧收集
    memcached 命令操作详解
    C#中WindowsForm常见控件的运用
    多线程实践
  • 原文地址:https://www.cnblogs.com/ssfzzzc/p/3792124.html
Copyright © 2020-2023  润新知