C++-蓝桥杯-锦标赛[2014真题][水题][代码填空]

网络上流传的版本是错的,还有那么多人转载,真的是醉了

代码的思路是比较a数组,用b数据记录下标,故答案为(a[b[k1]]>a[b[k2]])

 1 #include<bits/stdc++.h>
 2 //重新决出k号位置,v为已输出值 
 3 void pk(int* a, int* b, int n, int k, int v)
 4 {
 5     int k1 = k*2 + 1;
 6     int k2 = k1 + 1;
 7     
 8     if(k1>=n || k2>=n){
 9         b[k] = -1;
10         return;
11     }
12     
13     if(b[k1]==v) 
14         pk(a,b,n,k1,v);
15     else
16         pk(a,b,n,k2,v);
17     
18     //重新比较
19     if(b[k1]<0){
20         if(b[k2]>=0)
21             b[k] = b[k2]; 
22         else
23             b[k] = -1;
24         return;
25     }
26     
27     if(b[k2]<0){
28         if(b[k1]>=0)
29             b[k] = b[k1]; 
30         else
31             b[k] = -1;
32         return;
33     }
34     if(a[b[k1]]>a[b[k2]])
35         b[k] = b[k1];
36     else
37         b[k] = b[k2];
38 }
39 
40 //对a中数据,输出最大,次大元素位置和值 
41 void f(int* a, int len)
42 {
43     int n = 1;
44     while(n<len) n *= 2;
45     
46     int* b = (int*)malloc(sizeof(int*) * (2*n-1));
47     int i;
48     for(i=0; i<n; i++){ 
49         if(i<len) 
50             b[n-1+i] = i;
51         else
52             b[n-1+i] = -1;
53     }
54     
55     //从最后一个向前处理
56     for(i=2*n-1-1; i>0; i-=2){
57         if(b[i]<0){
58             if(b[i-1]>=0)
59                 b[(i-1)/2] = b[i-1]; 
60             else
61                 b[(i-1)/2] = -1;
62         }
63         else{
64             if(a[b[i]]>a[b[i-1]])
65                 b[(i-1)/2] = b[i];
66             else
67                 b[(i-1)/2] = b[i-1];
68         }
69     }
70     
71     //输出树根
72     printf("%d : %d\n", b[0], a[b[0]]);
73     
74     //值等于根元素的需要重新pk
75     pk(a,b,2*n-1,0,b[0]);
76     
77     //再次输出树根
78     printf("%d : %d\n", b[0], a[b[0]]);
79     
80     free(b);
81 }
82 
83 
84 int main()
85 {
86     int a[] = {54,55,18,16,122,17,30,9,58};
87     f(a,9);    
88 }

 

posted @ 2020-03-05 17:29  墨鳌  阅读(221)  评论(0编辑  收藏  举报