将一系列给定数字插入一个初始为空的小顶堆H[]
。随后对任意给定的下标i
,打印从H[i]
到根结点的路径。
输入格式:
每组测试第1行包含2个正整数NN和MM(\le 1000≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的NN个要被插入一个初始为空的小顶堆的整数。最后一行给出MM个下标。
输出格式:
对输入中给出的每个下标i
,在一行中输出从H[i]
到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。
输入样例:
5 3
46 23 26 24 10
5 4 3
输出样例:
24 23 10 46 23 10 26 10
本题不可以先将所有输入存入数组,然后用percdown来从数组中建堆,这会使得输出的顺序不对。
应该采用每读入一个新的数据就往堆中插入的方法。
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 #define TYPE int 5 #define MINNUM -10001 6 void PrintPath( TYPE* A, int N, int i ); 7 void Insert( TYPE *A, int N, TYPE X ); 8 9 int main( ){ 10 int N;//插入元素的个数 11 int M;//需要打印的路径条数 12 int* A; 13 scanf( "%d %d", &N, &M ); 14 A = ( TYPE* ) malloc( sizeof( TYPE ) * ( N + 1 ) ); 15 A[ 0 ] = MINNUM; 16 if( !A ){ 17 exit( EXIT_FAILURE ); 18 } 19 for( int i = 1; i <= N; i++ ){ 20 TYPE data; 21 scanf( "%d", &data ); 22 Insert( A, i, data ); //将data插入 23 } 24 for( int i = 0; i < M; i++ ){ 25 int k; 26 scanf( "%d", &k ); 27 PrintPath( A, N, k ); 28 } 29 free( A ); 30 return 0; 31 } 32 33 /*将X插入到N个元素的A中(加上X 为N个)*/ 34 void Insert( TYPE *A, int N, TYPE X ){ 35 int i = N; 36 for( i = N; A[ i / 2 ] > X; i /= 2 ){ 37 A[ i ] = A [ i / 2 ]; 38 } 39 A[ i ] = X; 40 } 41 /*打印从A[i]到顶点A[1]的路径*/ 42 void PrintPath( TYPE* A, int N, int i ){ 43 while( i > 0 ){ 44 if( i > 1 ){ 45 printf( "%d ", A[ i ] ); 46 } 47 else{ 48 printf( "%d\n", A[ i ] ); 49 } 50 i /= 2; 51 } 52 }