洛谷 P2085 最小函数值(minval)

71 篇文章 0 订阅
13 篇文章 0 订阅

题目大意:
在很多个函数a[i]*x^2+b[i]*x+c[i],求出最小的M个。
堆:
1.将x=1时的全部函数加入堆里建立一个堆。
2.每次找最小的函数输出,然后把这个函数的x+1的结果加入堆,排序。
时间复杂度:O(N+M)

var
   a:array [0..10001,1..3] of longint;
   f,b:Array [0..10001] of longint;
   n,m,i,j,ans:longint;

procedure down(x:longint);
begin
      repeat
           x:=x*2;
           if x<n then
              if f[x]>f[x+1] then inc(x);
           if f[x div 2]>f[x]
              then begin
                      f[0]:=f[x div 2];
                      f[x div 2]:=f[x];
                      f[x]:=f[0];
                      a[0]:=a[x div 2];
                      a[x div 2]:=a[x];
                      a[x]:=a[0];
                      b[0]:=b[x div 2];
                      b[x div 2]:=b[x];
                      b[x]:=b[0];
                   end
              else break;
      until x*2>n;
end;

begin
    readln(n,m);
    for i:=1 to n do
        begin
            for j:=1 to 3 do
                begin
                    read(a[i,j]);
                    f[i]:=f[i]+a[i,j];
                end;
            b[i]:=1;
        end;
    for i:=n div 2 downto 1 do down(i);
        for i:=1 to m do
            begin
                write(f[1],' ');
                inc(b[1]);
                f[1]:=a[1,1]*b[1]*b[1]+a[1,2]*b[1]+a[1,3];
                down(1);
            end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值