zoukankan      html  css  js  c++  java
  • UESTC_秋实大哥与妹纸 2015 UESTC Training for Data Structures<Problem F>

    F - 秋实大哥与妹纸

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 1500/1500KB (Java/Others)
     

    致中和,天地位焉,万物育焉。秋实大哥是一个追求中庸的人。

    虽然秋实大哥的仰慕者众多,但秋实大哥不喜欢极端的妹纸。所以他想从所有仰慕自己的妹纸中挑选出一个符合中庸之道的。

    每一个妹纸对秋实大哥的仰慕程度可以用一个整数ai来表示,秋实大哥想要找出这些数的中位数。

    计算有限个数的数据的中位数的方法是:

    把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;
    如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。

    Input

    第一行有一个整数n,表示秋实大哥的仰慕者数目。

    接下来n行,每行有一个正整数ai

    1n2500001ai<231

    Output

    输出这n个数的中位数,保留一位小数。

    Sample input and output

    Sample InputSample Output
    3
    1
    2
    3
    2.0

    Hint

    注意内存大小限制。

    解题报告:

    内存只能开一半..我们采用大根堆来维护,前一半直接读入大根堆,对于后一半的数据,若该数大于跟的max,则该元素是无用的,若小于,pop掉max值,再将该值压入heap中,最后根据n的奇偶性来读取heap前两层的数.

    因为本题内存限制很紧。。因此使用的C语言来写

    #include <stdio.h>
    #define maxn 125005
    int heapsize = 0,heap[maxn],maxheapsize,n;
    
    void swap(int *x,int *y)
    {
       int temp = *x;
       *x = *y;
       *y = temp;
    }
    
    void insert(int x)
    {
      heap[++heapsize] = x;
      int cur = heapsize , pre = heapsize / 2;
      while(pre > 0)
       {
             if (heap[cur] > heap[pre])
              {
                    swap(&heap[cur],&heap[pre]);
                    cur = pre;
                    pre = cur / 2;
           }
          else
           break;
       }
    }
    
    void maintainheap()
    {
       // New Ele insert,maintain the heap
       int cur = 1 , tar = 2*cur;
       while(tar <= maxheapsize)
        {
           if (tar + 1 <= heapsize && heap[tar+1] > heap[tar])
            tar++;
           if (heap[tar] > heap[cur])
            {
                swap(&heap[tar],&heap[cur]);
                cur = tar;
                tar = cur*2;
            }
           else
            break;
        }
    }
    
    int main(int argc,char *argv[])
    {
      int i;
      scanf("%d",&n);
      maxheapsize = n/2+1;
      for(i = 1 ; i <= maxheapsize ; ++ i)
           {
              int temp;
              scanf("%d",&temp);
              insert(temp);
        }
      for(; i <= n ; ++ i)
        {
           int temp;
           scanf("%d",&temp);
           if (temp < heap[1])
               {
                 heap[1] = temp;
                 maintainheap();
            }
        }
      long long ans = 0;
      if (n % 2)
       {
             ans = heap[1];
             printf("%.1f
    ",(double)ans);
       }
      else
       {
            ans = heap[1];
            long long qans = heap[2];
            if (heap[3] > qans)
             qans = heap[3];
            ans += qans;
            printf("%.1f
    ",(double)ans/2.*1.);
       }
      return 0;
    }
    No Pain , No Gain.
  • 相关阅读:
    .NET反编译工具:de4dot
    Hadoop API:遍历文件分区目录,并根据目录下的数据进行并行提交spark任务
    hive优化之——控制hive任务中的map数和reduce数
    Spark:将RDD[List[String,List[Person]]]中的List[Person]通过spark api保存为hdfs文件时一直出现not serializable task,没办法找到"spark自定义Kryo序列化输入输出API"
    spark算子:combineByKey
    spark分区数,task数目,core数,worker节点个数,excutor数量梳理
    spark算子:partitionBy对数据进行分区
    算子:sample(false, 0.1)抽样数据
    hive:默认允许动态分区个数为100,超出抛出异常:
    Oracle ADDM性能诊断利器及报告解读
  • 原文地址:https://www.cnblogs.com/Xiper/p/4470212.html
Copyright © 2011-2022 走看看