PTA-堆中的路径

来源:互联网 发布:淘宝怎么加入一淘 编辑:程序博客网 时间:2024/06/05 12:41

将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入格式:

每组测试第1行包含2个正整数NNMM(\le 10001000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的NN个要被插入一个初始为空的小顶堆的整数。最后一行给出MM个下标。

输出格式:

对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

输入样例:

5 346 23 26 24 105 4 3

输出样例:

24 23 1046 23 1026 10

先把节点插到队列尾端,然后重下向上更新,如果父节点大于子节点,交换位置,然后继续更,直到不能更新结束

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <algorithm>#include <map>#include <cmath>using namespace std;int n,m,x,cnt;int a[1010];void Change(int x){while(x>1){if(a[x]<a[x/2])swap(a[x],a[x/2]);elsereturn;x = x/2;}}int main(){scanf("%d %d",&n,&m);for(int i = 1; i <= n; i++){scanf("%d",&x);a[i] = x;if(i>1)Change(i);}for(int i = 0; i < m; i++){scanf("%d",&x);while(x>=1){if(x == 1)printf("%d\n",a[1]);elseprintf("%d ",a[x]);x = x/2;}}return 0;}


0 0
原创粉丝点击