问题 A: 动态中位数问题

时间限制: 1 Sec  内存限制: 8 MB
提交: 866  解决: 102
提交 状态 算法问答

题目描述

输入一组整数a1, a2, …, an ,每输入一个整数,输出到此时为止的中位数。

中位数定义:如果数串的大小是偶数 2j,中位数是从小到大排列的第 j 个数;如果数串的大小是奇数 2j+1,中位数是从小到大排列的第 j+1 个数。

输入

一组整数,数字和数字之间以空格隔开。

输出

一组整数,数字和数字之间以空格隔开。最后一个数后面也有空格。

第 i 个输出的整数,是前 i 个输入的中位数。

样例输入

-18 -2 14 -20 -6 7 2 14 11 6 

样例输出

-18 -18 -2 -18 -6 -6 -2 -2 2 2 

提示

时间复杂度请不要超过O(nlogn)。
由于输入输出的量会比较大,因此推荐使用c语言中的scanf和printf函数来进行输入输出,能比c++中cin和cout节省许多时间。

这里本来有一行提示,但是由于老师上课不小心说漏嘴了,于是助教狠心地把它注释掉了 ;

/*在处理该问题时,堆结构也许能给你带来意想不到的帮助。*/

答案

比较尴尬,最近一忙就忘记做了,所以答案没有经过oj测试,仅供参考(但测试用例一遍过了)

思路就是维护一个mid值、最大堆(存放比mid小的值)、最小堆(存放比mid大的值),每次读入一个数,根据两边堆的大小来判断当前值,具体怎么判断见代码注释,代码中有关STL中堆的使用操作就不多数了,自行查阅。

代码在VS2017上运行,在读入输出部分可能需要更改一下,scanf_s改scanf?

int main()
{
vector<int> heap_small; //这应该是个最大堆,存放着比mid小的元素
vector<int> heap_big; //这应该是个最小堆,存放着比mid大的元素
int mid =;
scanf_s("%d",&mid);
printf("%d ",mid);
int temp = ;
while (scanf_s("%d",&temp)!=EOF) {
if (temp < mid) {
if (heap_small.size() == heap_big.size()) {
//左侧和右侧一样大,将mid放入heap_big中,temp放入heap_small中,然后从heap_small选一个最大的作为mid
heap_big.emplace_back(mid);
push_heap(heap_big.begin(), heap_big.end(), [](int a, int b) {return b < a; });
heap_small.emplace_back(temp);
push_heap(heap_small.begin(),heap_small.end());
pop_heap(heap_small.begin(), heap_small.end());
mid = heap_small.back();
heap_small.pop_back();
}else if (heap_small.size() == heap_big.size() - ) {
//右侧比左侧多一个,将temp放入heap_small中,然后mid还是为中位数
heap_small.emplace_back(temp);
push_heap(heap_small.begin(), heap_small.end());
}else {
//左侧比右侧多一个的情况应该不会出现
cout << "wrong" << endl;
}
}
else {
if (heap_small.size() == heap_big.size()) {
//左侧和右侧一样大,将temp放入heap_big中,mid还是中位数
heap_big.emplace_back(temp);
push_heap(heap_big.begin(), heap_big.end(), [](int a, int b) {return b < a; });
}
else if (heap_small.size() == heap_big.size() - ) {
//右侧比左侧多一个,将mid放入heap_small中,然后将temp放入heap_big中,然后从heap_big选一个最小的作为mid
heap_small.emplace_back(mid);
push_heap(heap_small.begin(), heap_small.end());
heap_big.emplace_back(temp);
push_heap(heap_big.begin(), heap_big.end(), [](int a, int b) {return b < a; });
pop_heap(heap_big.begin(), heap_big.end(), [](int a, int b) {return b < a; });
mid = heap_big.back();
heap_big.pop_back();
}
else {
//左侧比右侧多一个的情况应该不会出现
cout << "wrong" << endl;
}
}
printf("%d ",mid);
}
return ;
}

问题 B: 非完美二叉树的高度与直径

时间限制: 2 Sec  内存限制: 3 MB
提交: 249  解决: 95
提交 状态 算法问答

题目描述

记T为一棵二叉树,树中共有n个节点。

定义根节点的深度为0,其余节点的深度为其父节点的深度加1。T的高度定义为其叶节点深度的最大值。

定义树中任意两点a和b之间的距离为其间最短简单路径的长度。T的直径定义为T中所有点对间距离的最大值。

输入一棵二叉树T,请计算它的高度和直径。

输入

输入共三行。

第一行输入n的值,表示树中结点的总个数。

第二行为树的前序遍历表示,每个节点之间用空格隔开。

第三行为树的中序遍历表示,每个节点之间也用空格隔开。

输出

输出共三行。
第一行需要大家输出一行字符串,它是“我已阅读关于抄袭的说明”的英文翻译,即:"I have read the rules about plagiarism punishment"。输出此行的提交我们将认为已经完全阅读并了解了“关于抄袭的说明”公告并同意关于抄袭的惩罚措施。
第二行输出树的高度。
第三行输出树的直径。

样例输入

10
0 1 9 3 8 4 2 7 5 6
3 9 8 1 2 4 0 5 7 6

样例输出

I have read the rules about plagiarism punishment
3
5

提示

分治算法可以在O(n)的时间内完成相应的计算。

答案

没法提交了,懒得写了,网上答案挺多的

南大算法设计与分析课程OJ答案代码(3)的更多相关文章

  1. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB提交: 475  解决: 34提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如果点 ...

  2. 南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和

    问题 A: 变位词 时间限制: 2 Sec  内存限制: 10 MB提交: 322  解决: 59提交 状态 算法问答 题目描述 请大家在做oj题之前,仔细阅读关于抄袭的说明http://www.bi ...

  3. 南大算法设计与分析课程OJ答案代码(2)最大子序列和问题、所有的逆序对

    问题 A: 最大子序列和问题 时间限制: 1 Sec  内存限制: 4 MB提交: 184  解决: 66提交 状态 算法问答 题目描述 给定一整数序列 a1, a2, …, an,求 a1~an 的 ...

  4. 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数

    问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...

  5. 南大算法设计与分析课程复习笔记(1) L1 - Model of computation

    一.计算模型 1.1 定义: 我们在思考和处理算法的时候是机器无关.实现语言无关的.所有的算法运行在一种“抽象的机器”之上,这就是计算模型. 1.2 种类 图灵机是最有名的计算模型,本课使用更简单更合 ...

  6. 南大算法设计与分析课程复习笔记(4)L4 - QuickSort

    一.快速排序 算法导论上关于快速排序有两种写法 第一种,从头到尾遍历,不断将小于基准元素的项移到前面.代码很简介,只需要维护一个交换位置,表示小于基准元素的末尾位置加一 我们看算法导论上的一个例子: ...

  7. 南大算法设计与分析课程复习笔记(3)L3 - Recursion

    一.递归方程 按照分治的思想,可以将一个递归的复杂度写成递归方程 一.解递归方程--猜然后证明 该方法又称为代入法,步骤如下: 1.猜解的形式 2.数学归纳法证明正确 例子: 我们假设有如下递归式: ...

  8. 南大算法设计与分析课程复习笔记(2)L2 - Asymptotics

    一.几种比较复杂度的符号 数据结构有描述,相关严格数学定义也不想说了,就这么过了吧. 二.最大子数组的几种解决方法 从最复杂的暴力解法过渡到最简单的动态规划 解析和代码见这里:http://www.c ...

  9. 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)

    PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...

随机推荐

  1. IntelliJ IDEA的main方法,for循环,syso的快捷键

    原文链接:http://blog.csdn.net/tiantiandjava/article/details/42269173 今天偶然发现了IntelliJ中 创建main函数的快捷键,依次还有f ...

  2. 安装kylin的艰难历程

    前言:暑假里老师布置的任务没有完成,来到学校后马不停蹄的安装kylin,结果一路艰难险阻,搞了快两个星期都没有弄好....现在止步于hive阶段卡死...仅将之前的步骤记录下来以便重新安装时更加顺利. ...

  3. Codeforces Round #425 (Div. 2)

    A 题意:给你n根棍子,两个人每次拿m根你,你先拿,如果该谁拿的时候棍子数<m,这人就输,对手就赢,问你第一个拿的人能赢吗 代码: #include<stdio.h>#define ...

  4. Java开发面试题,3年工作经验的Java程序员面试经

    一.Java基础部分 1.使用length属性获取数组长度,public.private.protected.friendly区别 2.Collection和Collections区别 3.Strin ...

  5. PHP实现大文件下载

    实现大文件下载的关键在于循环读取字节流 function downloadFile($filename) { //获取文件的扩展名 $allowDownExt = array ( 'rar', 'zi ...

  6. 如何把web.xml中的context-param、Servlet、Listener和Filter定义添加到SpringBoot中

    把传统的web项目迁移到SpringBoot中,少不了web.xml中的context-param.Servlet.Filter和Listener等定义的迁移. 对于Servlet.Filter和Li ...

  7. Jdk_API——1.8和Jdk_API1.6下载分享

    1.JDK   API   1.6 链接:https://pan.baidu.com/s/1bZKfldtqjCOsaYaT1Q9RcQ 提取码:t9ad 2.JDK API 1.8 链接:https ...

  8. Mybatis优缺点

    优点:SQL写在XML中,便于统一管理和优化 提供映射标签,支持对象和数据库的orm字段关系映射 可以对SQL进行优化      缺点: SQL工作量大 mybagtis移植姓不好 不支持级联

  9. docker 简单介绍及基础命令运用

    一.什么是docker? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. 简单的来讲Docker实际上就是一个大型容器.容器是完全使用沙箱机制,相互之间不 ...

  10. Docker - 参考信息

    初见 从 0 开始了解 Docker 可能是把Docker的概念讲的最清楚的一篇文章 Docker新手指南 8 个基本的 Docker 容器管理命令 Docker 核心技术与实现原理 在线教程 Doc ...