UESTC 1063 秋实大哥与妹子(二叉堆)

题目链接: 点我跳转~

题意: 求中位数。

注意事项: (1)n最大为250000。 (2)内存限制大小为1500KB。

思路: 由于内存限制,只能开大概 n/2 大小的数组。如果 n 为偶数,排序之后,中位数的位置会出现在 n/2,和 n/2 + 1,

而如果 n 为奇数则中位数的位置在 n/2 + 1,所以数组大小开 n/2 + 1。首先对前 n/2 + 1个数字建立一个大根堆。对于之后的

输入维护这个大根堆。输入完成之后进行排序,根据 n 的奇偶来选择堆中最大,或第一第二大的数字求出中位数。

如果之前会堆排序的话,这道题就差不多可以AC了。

堆排序

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

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

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

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

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

Input

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

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

1≤n≤250000 ,1≤a i <2 ^31  。

Output

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

Sample input and output

3
1
2
3
2.0

Hint

注意内存大小限制。

代码:

#include <stdio.h>
#include <algorithm>
#define N 125007
using namespace std;
void downAdjust(int  *num, int i, int n)   //对i元素向下找到合适的位置
{
    int lchild, rchild;
    lchild = i * 2;
    rchild = i * 2 + 1;
    int max_i = i;
    if (i <= n/2)
    {
        if (num[lchild] > num[max_i] && lchild <= n)
            max_i = lchild;
        if (num[rchild] > num[max_i] && rchild <= n)
            max_i = rchild;
        if (max_i != i)
        {
            swap(num[i], num[max_i]);
            downAdjust(num, max_i, n);
        }
    }
}
void Build(int *num, int n)    //建立一个大根堆
{
    for (int i = n/2; i >= 1; i--)
        downAdjust(num, i, n);
}
void Sort(int *num, int n)     //堆排序
{
    Build(num, n);
    for (int i = n; i >= 1; i--)
    {
        swap(num[i], num[1]);
        downAdjust(num, 1, i - 1);
    }
}
int main()
{
    int n, num[N];
    while (scanf("%d", &n) != EOF)
    {
        for (int i = 1; i <= n/2 + 1; i++)
        {
            scanf("%d", &num[i]);
        }
        Build(num, n/2 + 1);
        int temp;
        for (int i = n/2 + 2; i <= n; i++)   //对后一半的输入维护大根堆
        {
            scanf("%d", &temp);
            if (temp >= num[1])
                continue;
            num[1] = temp;
            downAdjust(num, 1, n/2 + 1);
        }
        Sort(num, n/2 + 1);
        if (n % 2)
        {
            printf("%.1lf\n", (double)num[n/2 + 1]);
        }
        else
        {
            double ans = num[n/2] >= num[n/2 - 1] ? num[n/2] : num[n/2 - 1];
            ans += (double)num[n/2 + 1];
            ans /= 2.0;
            printf("%.1lf\n", ans);
        }
    }
    return 0;
}
时间: 2024-10-17 11:29:56

UESTC 1063 秋实大哥与妹子(二叉堆)的相关文章

UESTC 1073 秋实大哥与线段树(线段树---省时的建树)

题目链接:http://acm.uestc.edu.cn/#/problem/show/1073 “学习本无底,前进莫徬徨.” 秋实大哥对一旁玩手机的学弟说道. 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构. 为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作. 秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值:一种是询问一段区间的和. Input 第一行包含一个整数n ,表示序列的长度. 接下来一行包含n  个整数a i  ,表示序列

UESTC 1061 秋实大哥与战争 线段树区间合并

秋实大哥与战争 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 男儿何不带吴钩,收取关山五十州. 征战天下是秋实大哥一生的梦想,所以今天他又在练习一个对战游戏. 秋实大哥命令所有士兵从左到右排成了一行来抵挡敌人的攻击. 敌方每一次会攻击一个士兵,这个士兵就会阵亡,整个阵列就会从这个位置断开:同时有的时候已阵亡的士兵会受人赢气息感染而复活. 秋实大哥想知道某一时刻某一个士兵所在的

uestc 1073 秋实大哥与线段树 Label:线段树

秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) “学习本无底,前进莫徬徨.” 秋实大哥对一旁玩手机的学弟说道. 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构. 为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作. 秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值:一种是询问一段区间的和. Input

UESTC 1059 秋实大哥与小朋友(线段树 + 离散化)

Description 秋实大哥以周济天下,锄强扶弱为己任,他常对天长叹:安得广厦千万间,大庇天下寒士俱欢颜. 所以今天他又在给一群小朋友发糖吃. 他让所有的小朋友排成一行,从左到右标号.在接下去的时间中,他有时会给一段区间的小朋友每人v v 颗糖,有时会问第x x 个小朋友手里有几颗糖. 这对于没上过学的孩子来说实在太困难了,所以你看不下去了,请你帮助小朋友回答所有的询问. Input 第一行包含两个整数n  ,m  ,表示小朋友的个数,以及接下来你要处理的操作数. 接下来的m  行,每一行表

UESTC 1073 秋实大哥与线段树 (线段树)

“学习本无底,前进莫徬徨.” 秋实大哥对一旁玩手机的学弟说道. 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构. 为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作. 秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值:一种是询问一段区间的和. Input 第一行包含一个整数nn,表示序列的长度. 接下来一行包含nn个整数aiai,表示序列初始的元素. 接下来一行包含一个整数mm,表示操作数. 接下来mm行,每行是以下两种操作之一: 1 x

UESTC 1091秋实大哥の恋爱物语 [偏移模式匹配]

题目链接:http://acm.uestc.edu.cn/#/problem/show/1091 题目大意:求模式串p,在s中出现的次数,但是p能平移到s即可,比如s: 1 3 4和 p :0 2 3: 题目思路:处理出每一位相对前一位的变化,然后KMP即可: 代码: //author:ACsorry //result:Yes #include<iostream> #include<cstdio> #include<cstring> #include<cmath&

UESTC 1057 - 秋实大哥与花

线段树第一题,自己把模板一点点慢慢码出来. 线段树讲解:http://www.cnblogs.com/TenosDoIt/p/3453089.html 有一些注意点,比如要开4倍的MAXN,否则在数据较大时会RE,引用来自CSDN上的一段话: 1 #include<cstdio> 2 #define MAXN 100000+5 3 typedef long long ll; 4 struct Node{ 5 int l,r; 6 ll sum,lazy; 7 void update(ll x)

UESTC_秋实大哥去打工 2015 UESTC Training for Data Structures&lt;Problem G&gt;

G - 秋实大哥去打工 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 天行健,君子以自强不息.地势坤,君子以厚德载物. 天天过节的秋实大哥又要过节了,于是他要给心爱的妹子买礼物.但由于最近秋实大哥手头拮据,身为一个男人,他决定去打工! 秋实大哥来到一家广告公司.现在有n块矩形墙从左至右紧密排列,每一块高为Hi,宽为Wi. 公司要求秋实大哥找出一块最

UESTC_秋实大哥与连锁快餐店 2015 UESTC Training for Graph Theory&lt;Problem A&gt;

A - 秋实大哥与连锁快餐店 Time Limit: 9000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 成大事者,不惟有超世之才,亦有坚忍不拔之志. 秋实大哥开了一家快餐店之后,由于人赢光环的影响,很快就赚得了大量的资金.为了继续实现心中的远大的理想,他打算在全国各地开设分店赚大钱.假设现在有n家快餐店(其中有至少有一家是旗舰店)分布在二维平面上,第i家快餐店的坐标为(xi,