2017.5.27测试 4.截取

解决一个数学问题:如何从N段已知长度的线中切割出K段等长的最大线段,确保精度达到两位小数。使用了二分查找算法进行求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.截取

                                       (a.pas/c++)                                 

【题目描述】

    给你N段线的长度,现在要你从他们上面切下K段来(切下的不能合并),使得这K段长度相等,并且最大。如若求出的答案小于0.01,则认为无解,输出0.00。(所有非整数都精确到了两位,输出亦然)1<=NK<=10000

【样例输入】
4 11
8.02(在1到100000之间的实数)
7.43
4.57
5.39

【输出样例】
2.00

var
 a:array[1..10000]of int64;//好大啊
 n,k,sum,max,min,ans:int64;
 i:longint;//循环不能太大
 m:real;//输出是小数
function check(x:longint):int64;//找目前每段的最大值
var
 y:int64;
begin
 y:=0;
 for i:=1 to n do y:=y+a[i] div x;
 check:=y;
end;
procedure try(l,r:int64);//二分的递推
var
 mid,t:int64;
begin
 if l>r then exit;
 mid:=(l+r) div 2;
 t:=check(mid);
 if t<k then try(l,mid-1)
        else begin
              if (t<min) or ((t=min) and (ans<mid)) then
                                                     begin
                                                      min:=t;
                                                      ans:=mid;
                                                     end;
              try(mid+1,r);
             end;
end;
begin
 assign(input,'a.in');reset(input);
 assign(output,'a.out');rewrite(output);

 readln(n,k);
 for i:=1 to n do
  begin
   readln(m);
   a[i]:=round(m*100);//搞成整数
   inc(sum,a[i]);//算总长
  end;
 max:=sum div k;//切下来最长的长度=总长/段数
 min:=maxlongint;
 try(1,max);
 if min=maxlongint then writeln('0.00')
                   else writeln(ans/100:0:2);

 close(input); close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值