暑假筆記 堆排序

2021-09-25 07:39:28 字數 1386 閱讀 4023

原題位址

題目描述

有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

**:

本題建立小根堆。

#include

#include

#include

#include

#include

#include

using namespace std;

int n,m;

int a[

10010

],b[

10010

],c[

10010

],f[

10010

],ans[

10010];

//a,b,c為函式引數,f[i]為第i個函式x的值,ans為結果

struct nod

qq[20010];

//陣列大小為2n

void

swap

(int u,

int v)

//交換函式

void

mini

(int x)

//比較函式

}void

build()

//建立根堆

intmain()

build()

;for

(i=1

;i<=m;i++

)for

(i=1

;i)printf

("%d "

,ans[i]);

printf

("%d\n"

,ans[m]);

return0;

}

筆記 堆排序

堆排序只需要記錄乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。堆的定義 n個元素的序列 當且僅當滿足如下關係時,稱之為堆。ki k2ik i k2 i 1 或 ki k 2iki k2i 1 i 1,2,3,n 2 若將和此序列對應的一維陣列看成是乙個完全二叉樹,則堆的含義表明,完全二...

演算法筆記 堆排序

堆排序是一種原地的,時間複雜度為 o nlogn 的排序演算法。快速排序的時間複雜度也是 o nlogn 甚至堆排序比快速排序的時間複雜度還要穩定,但是快速排序的效能要比堆排序好。什麼是堆 堆是乙個完全二叉樹。堆上任一節點的值都大於等於它的左右子樹的值,或者小於等於它的左右子樹的值。對於每個節點大於...

堆排序學習筆記

參考此文的學習筆記 不用交換,則已經是最大堆,不用迴圈了 else break void sort int a,int length 開始排序,排序是從上到下從左到右的調整 for int j length 1 j 0 j int main sort a,length for int i 0 i l...