【NOIP提高组五校联考】挖金矿

5 篇文章 0 订阅
1 篇文章 0 订阅

Description

这里写图片描述

Solution

第一眼看到题目就以为是贪心,每一列都是相对独立的,对于每一列都单独操作,最后再一起算答案。但是发现并不可以,因为可能一个数对于当前列而言是累赘,但是对于其他数来说却是助力,是可以选择的,这样的策略是错的。分析平均数的性质:这里写图片描述,我们可以二分答案,运用以上公式进行计算,若结果为负数则结果不合法,大于等于0则计入答案。(然而我被卡精度了)

Code

var
    a:array[0..100005] of int64;
    n,h,i,j:longint;
    x:int64;
    sum,num,ans,l,r,mid,s1,s2:extended;
function pd(x:extended):boolean;
var i,j:longint;
begin
    sum:=0;
    for i:=1 to n do
    begin
        s1:=a[i*h-h+1]-x;s2:=0;
        for j:=1 to h do
        begin
            s2:=s2+(a[i*h-h+j]-x);
            if s1<s2 then s1:=s2;
        end;
        sum:=sum+s1;
    end;
    if sum>=1e-6 then exit(true);exit(false);
end;
begin
    readln(n,h);
    for i:=1 to n do
    begin
        for j:=1 to h do
        begin
            read(a[i*h-h+j]);
            r:=r+a[i*h-h+j];
        end;
        readln;
    end;
    while l<r-(1e-6) do
    begin
        mid:=(l+r)/2;
        if pd(mid) then
        begin
            ans:=mid;
            l:=mid+(1e-6);
        end
        else r:=mid-(1e-6);
    end;
    if pd(l) then ans:=l;
    writeln(ans:0:4);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值