题目链接:http://acm.swust.edu.cn/problem/1094/

Time limit(ms): 1000      Memory limit(kb): 32768
 

中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,则中位数不唯一,通常取最中间的两个数值的平均数作为中位数。

Description

多组输入

第一行:一个正整数N (0<N<1000000)
第二行:N个正整数。(0=<A[i]<2^30)

Input

每组数据先输出”Case X:”,X表示测试数据的编号,从1开始。

第二行输出N个数,第i个数对应数组前i个值的中位数。(精确到小数点后一位)

Output
1
2
3
4
5
5
1 2 3 4 5
6
2 5 4 8 7 4
 
Sample Input
1
2
3
4
5
Case 1:
1.0 1.5 2.0 2.5 3.0
Case 2:
2.0 3.5 4.0 4.5 5.0 4.5
 
Sample Output
输出换行请使用\r\n

Hint
swust第10届校赛
 
 
解题思路:由于数据量太大,那么解题关键就在排序上面了,那么可以巧用堆排序,或者是使用容器 multiset(允许存在相同元素),那么就不会超时了。
 
下面是巧用容器的代码
 
  1. #include <iostream>
  2. #include <set>
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. #define rep(i,a,b) for(int i=a;i<=b;i++)
  7. int t, n;
  8. multiset<double>mpt;
  9.  
  10. void mid_num(){
  11. double x;
  12. printf("Case %d:\r\n", ++t);
  13. mpt.clear();
  14. scanf("%lf", &x);
  15. mpt.insert(x);
  16. multiset <double> ::iterator it = mpt.begin();
  17. printf("%.1lf", x);
  18. rep(i, , n){
  19. scanf("%lf", &x);
  20. mpt.insert(x);
  21. if (x < *it){
  22. if (i & ) printf(" %.1lf", *(--it));
  23. else {
  24. multiset <double> ::iterator it1 = it;
  25. printf(" %.1lf", (*it + *(--it1)) / 2.0);
  26. }
  27. }
  28. else {
  29. if (i & ) printf(" %.1lf", *it);
  30. else {
  31. ++it;
  32. multiset <double> ::iterator it1 = it;
  33. printf(" %.1lf", (*it + *(--it1)) / 2.0);
  34.  
  35. }
  36. }
  37. }
  38. printf("\r\n");
  39. }
  40.  
  41. int main(){
  42. while (~scanf("%d", &n))
  43. mid_num();
  44. return ;
  45. }

堆排序的代码也贴出来吧(原谅我太懒没有优化这代码~~~)

  1. #include <stdio.h>
  2. #include <string.h>
  3. int lstack[], ltot, rstack[], rtot, mid;
  4. int Max(int a, int b){
  5. return a > b ? a : b;
  6. }
  7. int Min(int a, int b){
  8. return a<b ? a : b;
  9. }
  10. void lup(int step){
  11. while (step != ){
  12. if (lstack[step]>lstack[step / ])lstack[step] ^= lstack[step / ] ^= lstack[step] ^= lstack[step / ];
  13. else break;
  14. step = step / ;
  15. }
  16. if (step == && lstack[] > mid) lstack[] ^= mid ^= lstack[] ^= mid;
  17. }
  18. void ldown(){
  19. if (ltot > && mid < lstack[]) mid ^= lstack[] ^= mid ^= lstack[];
  20. else return;
  21. int step = ;
  22. while (step * < ltot){
  23. if (step * + >= ltot){
  24. if (lstack[step] < lstack[step * ])
  25. lstack[step] ^= lstack[step * ] ^= lstack[step] ^= lstack[step * ], step = step * ;
  26. else return;
  27. }
  28. else{
  29. if (lstack[step] <= lstack[step * ] && lstack[step * + ] <= lstack[step * ])
  30. lstack[step] ^= lstack[step * ] ^= lstack[step] ^= lstack[step * ], step = step * ;
  31. else if (lstack[step] <= lstack[step * + ] && lstack[step * ] <= lstack[step * + ])
  32. lstack[step] ^= lstack[step * + ] ^= lstack[step] ^= lstack[step * + ], step = step * + ;
  33. else return;
  34. }
  35. }
  36. }
  37. void rup(int step){
  38. while (step != ){
  39. if (rstack[step]<rstack[step / ])rstack[step] ^= rstack[step / ] ^= rstack[step] ^= rstack[step / ];
  40. else break;
  41. step = step / ;
  42. }
  43. if (step == && rstack[]<mid) rstack[] ^= mid ^= rstack[] ^= mid;
  44. }
  45. void rdown(){
  46. if (rtot> && mid>rstack[]) mid ^= rstack[] ^= mid ^= rstack[];
  47. else return;
  48. int step = ;
  49. while (step * < rtot){
  50. if (step * + >= rtot){
  51. if (rstack[step] > rstack[step * ])
  52. rstack[step] ^= rstack[step * ] ^= rstack[step] ^= rstack[step * ], step = step * ;
  53. else return;
  54. }
  55. else{
  56. if (rstack[step] >= rstack[step * ] && rstack[step * + ] >= rstack[step * ])
  57. rstack[step] ^= rstack[step * ] ^= rstack[step] ^= rstack[step * ], step = step * ;
  58. else if (rstack[step] >= rstack[step * + ] && rstack[step * ] >= rstack[step * + ])
  59. rstack[step] ^= rstack[step * + ] ^= rstack[step] ^= rstack[step * + ], step = step * + ;
  60. else return;
  61. }
  62. }
  63. }
  64. int main()
  65. {
  66. int t = , n, i;
  67. while (scanf("%d", &n) != EOF){
  68. printf("Case %d:\r\n", t++);
  69. scanf("%d", &mid);
  70. ltot = rtot = ;
  71. printf("%.1lf", (double)mid);
  72. for (i = ; i < n; i++){
  73. if (i % ){
  74. scanf("%d", &lstack[ltot]);
  75. lup(ltot);
  76. rdown();
  77. ltot++;
  78. printf(" %.1lf", (mid + lstack[]) / 2.0);
  79. }
  80. else{
  81. scanf("%d", &rstack[rtot]);
  82. rup(rtot);
  83. ldown();
  84. rtot++;
  85. printf(" %.1lf", (double)mid);
  86. }
  87. }
  88. printf("\r\n");
  89. }
  90. return ;
  91. }

[Swust OJ 1094]--中位数(巧用set,堆排序)的更多相关文章

  1. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  2. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)

    题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...

  3. SWUST OJ NBA Finals(0649)

    NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128   Descri ...

  4. [Swust OJ 746]--点在线上(线段树解法及巧解)

    题目链接:http://acm.swust.edu.cn/problem/746/ Time limit(ms): 1000 Memory limit(kb): 65535   fate是一个数学大牛 ...

  5. [Swust OJ 1026]--Egg pain's hzf

      题目链接:http://acm.swust.edu.cn/problem/1026/     Time limit(ms): 3000 Memory limit(kb): 65535   hzf ...

  6. [swustoj 1094] 中位数

    中位数(1094) 问题描述 中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本.种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分.对于有限的数集,可以通过把所有 ...

  7. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

  8. [Swust OJ 1023]--Escape(带点其他状态的BFS)

    解题思路:http://acm.swust.edu.cn/problem/1023/ Time limit(ms): 5000 Memory limit(kb): 65535     Descript ...

  9. [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)

    题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

随机推荐

  1. Linux软件间的依赖关系(转)

    Linux中的软件大部分是零碎的,其粒度比windows的小很多,软件之间的依赖关系很强烈,下面是自己的一些理解: 一.Linux中的软件依赖Linux中的软件依赖关系成一颗拓扑树结构,比如A直接或间 ...

  2. eclipse设置web项目发布到tomcat根目录下

    如果已经将项目绑定到服务器了,那就先删除服务器. 重新添加项目进服务器,双击 修改下面Server Locations到tomcat目录下 顺带可以修改下右上角的超时设置 再点击下方 这样就可以了.

  3. 模拟美萍加密狗--Rockey2虚拟狗(三)

    几经挣扎,我最终还是选择了虚拟设备的方法来模拟Rockey2加密狗.HID.DLL劫持+API劫持的办法技术上虽然简单些,但太繁琐了,不仅要转发大量的函数,还要Hook好几个API,向我这么懒的人可干 ...

  4. linux内核源码阅读之facebook硬盘加速flashcache之二

    flashcache数据结构都在flashcache.h文件中,但在看数据结构之前,需要先过一遍flashcache是什么,要完成哪些功能?如果是自己设计这样一个系统的话,大概要怎么设计. 前面讲过, ...

  5. 【Leetcode】Triangle

    给定一个由数字组成的三角形,从顶至底找出路径最小和. Given a triangle, find the minimum path sum from top to bottom. Each step ...

  6. [置顶] c++播放Flash文件

    最近由于需要在程序中使用Flash播放,所以学习了下如何播放Flash,这里使用atl库中的CAxWindow来处理我们要播放的Flash!由于Flash的很多接口我们都不知道,所以可以参考前一篇文章 ...

  7. 一道月薪3W的java面试题 (小明和小强都是张老师的学生,张老师的生日是某月某日,2人都不知道张老师的生日)

    小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日 是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗? 3月4日 3月5日 3 ...

  8. Ext JS学习第十天 Ext基础之 扩展原生的javascript对象(二)

    此文来记录学习笔记: 今天继续说Ext.Array,Ext.Function,Ext.Date,Ext.Error ------------------------------------------ ...

  9. gets scanf以及缓冲区域的问题

    1:scanf scanf会忽略开头所有的空格,并以Space Enter Tab 结束输入, 不会舍弃最后的回车符(即回车符会残存在缓冲区域中) 2:getchar getchar以Enter结束, ...

  10. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...