ural 1306. Sequence Median

1306. Sequence Median

Time limit: 1.0 second
Memory limit: 1 MB
Language limit: C, C++, Pascal

Given a sequence of N nonnegative integers. Let‘s define the median of such sequence. If N is odd the median is the element with stands in the middle of the sequence after it is sorted. One may notice that in this case the median has position (N+1)/2 in sorted sequence if sequence elements are numbered starting with 1. If N is even then the median is the semi-sum of the two "middle" elements of sorted sequence. I.e. semi-sum of the elements in positions N/2 and (N/2)+1 of sorted sequence. But original sequence might be unsorted.

Your task is to write program to find the median of given sequence.

Input

The first line of input contains the only integer number N — the length of the sequence. Sequence itself follows in subsequent lines, one number in a line. The length of the sequence lies in the range from 1 to 250000. Each element of the sequence is a positive integer not greater than 231−1 inclusive.

Output

You should print the value of the median with exactly one digit after decimal point.

Sample

input output
4
3
6
4
5
4.5

Problem Source: II Collegiate Students Urals Programming Contest. Yekaterinburg, April 3-4, 1998

Tags: data structures  unusual problem  (hide tags for unsolved problems)

Difficulty: 153

题意:求n个数的中位数

分析:注意看空间限制。。。

显然,我们只能存下一半的数据,

怎么办呢。。。。

。。。。

那我们就存最大的那一半(n / 2 + 1)数据就好了。。

。。。然后我们就用一个堆或者其他什么存下来。。。

偶数就去存下来的前两个,奇数就取存下来的第一个

用优先队列是不行的,因为优先队列申请空间是一段一段的。。。

只能用make_heap了

 1 #include <cstdio>
 2 #include <queue>
 3 #include <iostream>
 4 using namespace std;
 5 inline void SetIO(string Name)
 6 {
 7     string Input = Name+".in",
 8     Output = Name+".out";
 9     freopen(Input.c_str(), "r", stdin),
10     freopen(Output.c_str(), "w", stdout);
11 }
12
13 int n, Arr[250000 / 2 + 5];
14
15 inline void Input()
16 {
17     scanf("%d", &n);
18 }
19
20 inline void Solve()
21 {
22     for(int i = 0; i < n / 2 + 1; i++) scanf("%d", &Arr[i]);
23     make_heap(Arr, Arr + n / 2 + 1);
24     for(int i = n / 2 + 1; i < n; i++)
25     {
26         scanf("%d", &Arr[n / 2 + 1]);
27         push_heap(Arr, Arr + n / 2 + 2);
28         pop_heap(Arr, Arr + n / 2 + 2);
29     }
30     if(n & 1) printf("%.1lf\n",1.0 * Arr[0]);
31     else
32     {
33         unsigned int x = Arr[0];
34         pop_heap(Arr, Arr + n / 2 + 1);
35         unsigned int y = Arr[0];
36         printf("%.1lf\n", 1.0 * (x + y) / 2.0);
37     }
38 }
39
40 int main()
41 {
42     #ifndef ONLINE_JUDGE
43     SetIO("G");
44     #endif
45     Input();
46     Solve();
47     return 0;
48 }

时间: 2024-10-23 03:14:15

ural 1306. Sequence Median的相关文章

URAL 1306 Sequence Median(优先队列)

题意:求一串数字里的中位数.内存为1M.每个数范围是0到2的31次方-1. 思路:很容易想到把数字全部读入,然后排序,但是会超内存.用计数排序但是数又太大.由于我们只需要第n/2.n/2+1大(n为偶数)或第(n+1)/2大(n为奇数).所以可以用优先队列来维护最值,这样只需要存一半元素(n/2+1个元素)就可以了. #include<cstdio> #include<algorithm> #include<queue> #define UL unsigned int

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

[题意]给出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(in

URAL 1528 Sequence

SequenceCrawling in process... Crawling failed Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice URAL 1528 Description You are given a recurrent formula for a sequence f: f(n) = 1 + f(1)g(1) + f(2)g(2

poj 2623 Sequence Median 堆的灵活运用

I - Sequence Median Time Limit:1000MS     Memory Limit:1024KB     64bit IO Format:%I64d & %I64u Submit Status Description Given a sequence of N nonnegative integers. Let's define the median of such sequence. If N is odd the median is the element with

URAL1306 Sequence Median(卡内存神题)

给出n个数,n<=250000,求这n个数的中位数,内存限制1mb 卡内存的神题,用数组存下来刚好1mb,再加上执行时消耗内存.立即爆. 因此我们用优先队列存储一半的数. 网上的某些代码,用priority_queue全爆内存. 我存的125000长度的数组.加上STL的make_heap() #include<cstdio> #include<queue> using namespace std; int a[125010]; int main() { int n,x; d

[Ural1306] Sequence Median(网上很多题解骗人,这才是对的!业界良心!)

血的教训: 1. 尽信题解,不如无题解! 2. C++ STL很坑爹.. 测试结果分析与比较: #1是我自己写的,使用priority_queue,超内存: #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; priority_queue <unsigned int> pq; int main(){ unsi

ural Brackets Sequence (dp)

http://acm.timus.ru/problem.aspx?space=1&num=1183 很经典的问题吧,看的黑书上的讲解. 设dp[i][j]表示i到j括号合法需要的最少括号数. 共有四种情况: s[i]s[j]配对,dp[i][j] = min( dp[i][j] ,  dp[i-1][j+1] ): s[i] = '('或'[' dp[i][j] = min( dp[i][j] , dp[i+1][j]+1 ): s[j] = ')'或']' dp[i][j] = min( dp

URAL 1306-Sequence Median(堆)

1306. Sequence Median Time limit: 1.0 second Memory limit: 1 MB Language limit: C, C++, Pascal Given a sequence of N nonnegative integers. Let's define the median of such sequence. If N is odd the median is the element with stands in the middle of th

URAL1306-Sequence Median(优先队列)

1306. Sequence Median Time limit: 1.0 second Memory limit: 1 MB Language limit: C, C++, Pascal Given a sequence of N nonnegative integers. Let's define the median of such sequence. If N is odd the median is the element with stands in the middle of th