zoukankan      html  css  js  c++  java
  • 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
    ", b[0], a[b[0]]);
    73     
    74     //值等于根元素的需要重新pk
    75     pk(a,b,2*n-1,0,b[0]);
    76     
    77     //再次输出树根
    78     printf("%d : %d
    ", 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 }
  • 相关阅读:
    .net调用Oracle存储过程
    Ext.Net基本讲解
    Sql Server数据库中的数据类型和c#的数据类型的映射表
    c#.net常用字符串函数 .
    Extjs & Ext.net中的一些属性
    Oracle表名做为参数 返回值
    Oracle CASE WHEN 用法介绍
    c开发策略之错误处理
    堆和栈的区别
    assert用法总结
  • 原文地址:https://www.cnblogs.com/JasonCow/p/12421429.html
Copyright © 2011-2022 走看看