码迷,mamicode.com
首页 > 其他好文 > 详细

URAL 1306 - Sequence Median 小内存求中位数

时间:2015-01-28 23:55:11      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

【题意】给出n(1~250000)个数(int以内),求中位数

 

【题解】一开始直接sort,发现MLE,才发现内存限制1024k,那么就不能开int[250000]的数组了(4*250000=1,000,000大约就是1M内存)。

后来发现可以使用长度为n/2+1的优先队列,即包含前一半的数以及中位数,其他数在读入的时候就剔除,这样可以省一半的空间。

 

 1 #include<bits/stdc++.h>
 2 #define eps 1e-9
 3 #define FOR(i,j,k) for(int i=j;i<=k;i++)
 4 #define MAXN 1005
 5 #define MAXM 40005
 6 #define INF 0x3fffffff
 7 using namespace std;
 8 typedef long long LL;
 9 int main()
10 {
11     int n,m,t,i;
12     scanf("%d",&n); m=n/2+1;
13     priority_queue <int> q;//定义优先队列
14     for (i=1;i<=m;i++)//先读入n/2+1个数,直接加入优先队列
15     {
16          scanf("%d",&t);
17          q.push(t);
18     }
19     for (i=m+1;i<=n;i++)//读入其他数
20     {
21         scanf("%d",&t);
22         if (t<q.top())//如果小于最大值,就把最大值挤掉,然后把它加进优先队列
23         {
24             q.push(t);
25             q.pop();
26         }
27     }
28     if (n%2) printf("%d\n",q.top());//n是奇数,优先队列最大值就是中位数
29     else//否则是前两大的数的平均值
30     {
31         LL sum=q.top();
32         q.pop();
33         sum+=q.top();
34         if (sum%2) printf("%I64d.5\n",sum/2);
35         else printf("%I64d\n",sum/2);
36     }
37     return 0;
38 }

 

URAL 1306 - Sequence Median 小内存求中位数

标签:

原文地址:http://www.cnblogs.com/zhyfzy/p/4257334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!