有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,bi<=100,ci<=10 000。
輸出將這n個函式所有可以生成的函式值排序後的前m個元素。這m個數應該輸出到一行,用空格隔開。
3 10
4 5 3
3 4 5
1 7 1
9 12 12 19 25 29 31 44 45 54
n,m<=10,000
首先根據二次函式的知識可以判斷出,這裡的每個函式在x>0範圍內都是單調遞增的。
可以根據堆的思想做這道題。開始時將每乙個函式的第乙個函式值加入小根堆,注意這裡堆必須記錄是第幾個函式。每次取出堆頂元素加入到答案中,同時將堆頂元素所在的函式下標+1,將新得到的函式值加入堆中。重複以上步驟直到取出m個答案。
時間複雜度o(mlogn)
#include
#include
#include
#include
using
namespace
std;
struct func
data[10050];
struct node
friend
bool
operator
<(const node &a,const node &b) heap[10050];
int n,m;
int t[10050];
priority_queuevector
,greater> q;
int calc(int k)
int main()
for(int i=1;i<=n;i++)
for(int i=1;iprintf("%d ",q.top().data);
int cc=q.top().k;
node temp;
temp.data=calc(cc);
temp.k=cc;
q.pop();
q.push(temp);
}printf("%d\n",q.top().data);
return
0;}
二叉堆 k路歸併問題(BSOJ1941)
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和...
2977 二叉堆練習1
時間限制 10 s 空間限制 32000 kb 題目等級 silver 題解檢視執行結果 已知乙個二叉樹,判斷它是否為二叉堆 小根堆 輸入描述 input description 二叉樹的節點數n和n個節點 按層輸入 輸出描述 output description yes或no 樣例輸入 sampl...
codevs3110二叉堆練習1
題目描述 description 給定n n 500,000 和n個整數 較有序 將其排序後輸出。輸入描述 input description n和n個整數 輸出描述 output description n個整數 公升序 樣例輸入 sample input 512 11 10 8 9 樣例輸出 s...