• sicily小内存找中位数


    /*
    sicily 一道找中位数的题目
    条件限制是内存小 , 不足以存下全部数字
    2M的内存空间 , 最大数目去到 500000 ;
    初略估算 : 一个Int 4个字节
    4 * 500000 = 2000000个字节 , 1MB = 1024 * 1024 个字节 = 1048576个字节
    2Mb就是 208000个字节 , 如果把所有数字都存放的话 , 在没有空间运行程序了 。
    因此考虑建一个堆 , 但是堆的大小只有 N/2 , 这样的话 , 还有1MB的运行空间 ,
    当后一半数据输入的时候,动态把堆的其中无用节点弹出,新的数值插入堆。

    */

    #include <stdio.h>
    #include <algorithm>

    using namespace std;

    int a[250005];
    //保持堆特性函数,非递归写法
    void max_heapify( int i, int length)
    {
    int largest = i;
    while(largest <= length - 1)
    {
    int left = 2*largest + 1;
    int right = 2*largest + 2;
    int temp = largest;
    if( left <= length - 1 && a[left] > a[largest])
    {
    largest = left;
    }
    if(right <= length - 1 && a[right] > a[largest])
    {
    largest = right;
    }
    //最小的元素位置错误 , 交换其位置 , 使其正确
    if(largest != temp)
    {
    int exchange = a[largest];
    a[largest] = a[temp];
    a[temp] = exchange;
    }
    else
    break;
    }
    }
    int main()
    {
    int n , size , temp ;

    scanf("%d" , & n );
    size = n / 2 + 1 ;
    for ( int i = 0 ; i < size ; i ++ )
    scanf("%d" , a + i );
    make_heap( a , a + size );

    for ( int i = 0 ; i < n - size ; i ++ )
    {
    scanf("%d" , & temp );
    if ( temp < a[0] )
    {
    a[0] = temp;
    max_heapify( 0 , size ) ;
    }
    }
    if ( n % 2 != 0 )
    {
    float d1 = a[0] ;
    printf( "%.1f\n" , d1 );
    }
    else
    {
    float d1 = a[0] ;
    float d2 ;
    d2 = max( a[1] , a[2] ) ;
    printf("%.1f\n" , (d1+d2) / 2.0 ) ;
    }


    return 0 ;
    }
  • 相关阅读:
    PHP对象的遍历
    PHP对象的复制
    PHP面向对象之类的自动加载
    PHP面向对象之接口
    PHP面向对象之重载
    PHP面向对象之抽象类,抽象方法
    PHP面向对象之final关键字
    PHP面向对象之重写
    使用python操作word
    vc++使用cookie登录网站
  • 原文地址:https://www.cnblogs.com/lzhenf/p/2289548.html
Copyright © 2020-2023  润新知