最小函式值(樹)

2021-07-11 01:59:02 字數 1947 閱讀 8683

description

問題描述:有n個函式,分別為f1,f2,...,fn。定義fi(x)=ai*x^2+bi*x+ci 

(x∈n*)。給定這些ai、bi和ci,請求出所有函式的所有函式值中最小的m個(如有重複的要輸出多個)。 

input

輸入資料:第一行輸入兩個正整數n和m。以下n行每行三個正整數,其中第i行的三個數分別位ai、bi和ci。ai<=10,bi<=100,ci<=10 000。

output

輸出資料:輸出將這n個函式所有可以生成的函式值排序後的前m個元素。這m個數應該輸出到一行,用空格隔開。

sample input

3 10 

4 5 3 

3 4 5 

1 7 1

sample output

9 12 12 19 25 29 31 44 45 54

hint

資料規模:n,m<=10 000

解題思路:

先讀入資料,分別讀入三個陣列,然後把他們製作成堆,再用迴圈,每輸出乙個就進行刪除,排序。

程式:var

a,b,c,x,d,p:array[1..10001]of longint;

m,n,i,j,xx,t,g,g1:longint;

procedure down;

vari,j,q:longint;

begin

d[1]:=d[t];

p[1]:=p[t];

x[1]:=x[t];

dec(t);

i:=1;

while i*2<=t do

begin

j:=i*2;

if (d[j+1]<=t) then inc(j);

if (d[j]

begin

q:=d[i]; d[i]:=d[j]; d[j]:=q;

q:=p[i]; p[i]:=p[j]; p[j]:=q;

q:=x[i]; x[i]:=x[j]; x[j]:=q;

end else exit;

i:=j;

end;

end;

procedure up(x1,y,z:longint);

vari,j,q:longint;

begin

inc(t);

d[t]:=x1;

p[t]:=y;

x[t]:=z;

i:=t;

while i>1 do

begin

j:=i div 2;

if d[j]>d[i] then

begin

q:=d[i]; d[i]:=d[j]; d[j]:=q;

q:=p[i]; p[i]:=p[j]; p[j]:=q;

q:=x[i]; x[i]:=x[j]; x[j]:=q;

end else exit;

i:=j;

end;

end;

begin

readln(n,m);

for i:=1 to n do

begin

readln(a[i],b[i],c[i]);

xx:=a[i]+b[i]+c[i];

up(xx,i,1);

end;

for i:=1 to m do

begin

write(d[1],' ');

g:=x[1]+1;

g1:=p[1];

down;

up(a[g1]*g*g+b[g1]*g+c[g1],g1,g);

end;

end.

版權屬於: 

chris

最小函式值

給n個函式。fi x ai x 2 bi x ci 給定這些ai bi和ci,請求出所有函式的所有函式值中最小的m個。3 10 4 5 3 3 4 5 1 7 1 9 12 12 19 25 29 31 44 45 54 維護乙個小根堆,裡面的值為,按照要求每次輸出堆頂,並將堆頂函式中的x加1再下調...

最小函式值

最小函式值 time limit 1000ms memory limit 65536k total submit 121 accepted 54 description 問題描述 有n個函式,分別為f1,f2,fn。定義fi x ai x 2 bi x ci x n 給定這些ai bi和ci,請求出...

最小函式值

題目描述 有n個函式,分別為f1,f2,fn。定義fi x aix 2 bix ci x n 給定這些ai bi和ci,請求出所有函式的所有函式值中最小的m個 如有重複的要輸出多個 輸入格式 輸入資料 第一行輸入兩個正整數n和m。以下n行每行三個正整數,其中第i行的三個數分別位ai bi和ci。ai...