題目內容:
實作max heap的三種操作:push, pop, top。
指令0 x:代表push,將x push進max heap。
指令1 : 代表pop,將最大的數字pop出來,若heap為空則忽略這道指令。
指令2 : 代表top,將最大的數字印出來,若heap為空則忽略這道指令。
輸入格式:
本題只有一道測資。
所有push的數字皆不相同。
0 < n < 20000
0 < x < 10000000
輸出格式:
將所有top指令輸出的數字作加總,最後輸出這個和。
hint : 注意overflow!
輸入樣例:151
0 9550684
0 853329312
210 505825
0 9809892
0 1484329
0 4958409
0 3788064
0 28006
20 2979864
輸出樣例:
26876478
時間限制:100ms記憶體限制:128000kb
實現方式一:(堆排序,時間複雜度:o(lgn))
1 #include 2intcmd1,cmd2;
3int count = 0;4
long
long sum = 0;5
long
long a[20000];6
7void push(long
long
a) else
18break;19
}20return;21
}2223void pop(long
long
a)27 a[1] = a[count--];
28int index = 1;29
int lchd = 2*index;
30int rchd = lchd+1;31
while(lchd<=count) else
45break;46
}47return;48
49}5051
void top(long
long
a)54
55int main(void)64
65if(cmd1==1)68
if(cmd1==2)71
}72 printf("
%lld
",sum);
73return0;
74 }
實現方式二:(時間複雜度:o(nlgn))
1 #include 2intcmd1,cmd2;
3int count = 0;4
long
long sum = 0;5
long
long a[20002];6
void heapadjust(long
long a,int i,int
size)
15if(r_child<=size&&a[r_child]>a[max])
18if(max !=i)24}
2526
void buildheap(long
long a,int
size)31}
3233
void push(long
long
a)37
38void pop(long
long
a)42 a[1] =a[count];
43 count--;
44buildheap(a,count);
45return;46
}4748void top(long
long
a)51
52int main(void)61
62if(cmd1==1)65
66if(cmd1==2)69
}70 printf("
%lld\n
",sum);
71return0;
72 }
堆排序法(Java C C 實現)
堆排序是利用堆這種資料結構而設計的一種排序演算法。時間複雜度為 o n lg n 介紹堆排序前,我們先介紹一下堆的相關概念,如果你對堆的概念還不熟悉的話可以看看。除最底層外,該樹是完全充滿的,且是從左到右填充。樹的根結點是 a 1 若某一結點下標為 i,則很容易得到它的父節點為 i 2,左子結點為 ...
歸併排序法 題目
題目內容 在乙個n個數字的序列s裡,當s i s j 且 i j的時候,我們說 i j 是乙個逆序數對。hint 利用歸併排序法計算乙個序列裡有多少逆序數對。hint 思考一下在merge的過程,怎麼找到答案 hint 直接使用兩層迴圈來找答案的話會超過系統時間限制。輸入格式 只有一筆測資,第一行為...
分治法 快速排序 歸併排序 堆排序
十種常見排序演算法可以分為兩大類 非線性時間比較類排序 通過比較來決定元素間的相對次序,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排序。0.2...