P2085 最小函式值 堆

2022-04-30 09:57:11 字數 1141 閱讀 8342

## 題目描述

有n個函式,分別為f1,f2,...,fn。定義fi(x)=aix^2+bix+ci (x∈n*)。給定這些ai、bi和ci,請求出所有函式的所有函式值中最小的m個(如有重複的要輸出多個)。

輸入格式:

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

輸出格式:

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

輸入樣例#1:

3 10

4 5 3

3 4 5

1 7 1

輸出樣例#1:

9 12 12 19 25 29 31 44 45 54

資料規模:n,m<=10000

這道題就是乙個堆的裸題.

但是我們需要推出以下幾個關鍵性質:

於是我便用了乙個堆來實現對於函式值的處理.

先把所有的函式 x=1 的情況都放進去,如果大小不夠m,那麼再繼續放 x=2 的情況,其他以此類推

再迴圈一遍所有函式的值,如果說當前這個函式的值已經大於我們的堆頂,就不再考慮這個函式,直接跳到下乙個函式.

最後面輸出堆內所有的值.

於是這樣即可.

#includeusing namespace std;

const int maxn=10008;

int a[maxn],b[maxn],c[maxn];

int n,m,now,be[maxn];

priority_queueq;

int f(int i,int j)

int main()

now=q.top();

for(int i=1;i<=n;i++)

for(int j=be[i];j<=m;j++)

int ans[maxn];

for(int i=1;i<=m;i++)

for(int i=1;i<=m;i++)

cout

}

P2085 最小函式值 堆

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

P2085 最小函式值

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

P2085 最小函式值

題目給你 n 個二次函式,給你 a b c 不過仔細的話可以發現 這三個係數都是正整數!所以意味著二次函式的對稱軸在x軸負半軸,在我們考慮的 1,infty 中的整數區間都是單調遞增的。所以同乙個函式中,x 1 時的函式值是最小的。如何求目標值?下面給出演算法。對於每個函式,是不是有乙個單調答案序列...