博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1168 中位数(优先队列)
阅读量:5325 次
发布时间:2019-06-14

本文共 1433 字,大约阅读时间需要 4 分钟。

嗯...

 

题目链接:https://www.luogu.org/problem/P1168

 

这道题暴力是肯定不行的,所以说要用优先队列来维护...

 

思路:

定义一个大根堆,一个小根堆,首先将第一个数随便放进一个堆(这里我们把它放入小根堆),然后再看下一个数,如果这个数比小根堆的堆顶大,那么就把它放入小根堆,否则将它放入大根堆。注意大小根堆的元素个数不能超过2(即不能>1),如果超过,则将元素多的那个堆的堆顶元素压入另一个堆,这样我们就维护了一个类似单调递增的序列,而这道题又比较水,只讨论了奇数个元素的情况,所以最终的答案就是元素较多的堆的堆顶。(下面附一张图,但我感觉不是很好,其实就是一个单调递增的序列...

细节:

第28行到第38行不能写成:

  if(q1.size() - q2.size() > 1){ q2.push(q1.top()) ; q1.pop(); }

 if(q2.size() - q1.size() > 1){ q1.push(q2.top()); q2.pop(); }  

这样的话在pop的之后改变了size的大小...在执行下一条语句还可能合法,然后会....

 

AC代码:

1 #include
2 #include
3 #include
4 #include
5 6 using namespace std; 7 8 priority_queue
q1; 9 priority_queue
, greater
> q2;10 int n, a;11 12 int main(){13 scanf("%d", &n);14 for(int i = 1; i <= n; i++){15 scanf("%d", &a);16 if(i == 1){17 printf("%d\n", a);18 q2.push(a);19 continue;20 }21 else{22 if(a < q2.top()) q1.push(a);23 else if(a > q2.top()) q2.push(a); 24 else{25 if(q1.size() < q2.size()) q1.push(a);26 else q2.push(a);27 }28 if(q1.size() - q2.size() > 1 || q2.size() - q1.size() > 1){29 if(q1.size() > q2.size()){30 q2.push(q1.top()) ;31 q1.pop();32 }33 else{34 q1.push(q2.top());35 q2.pop();36 }37 }38 }39 if(i % 2 && q2.size() > q1.size()) printf("%d\n", q2.top());40 else if(i % 2 && q1.size() > q2.size()) printf("%d\n", q1.top());41 }42 return 0;43 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/11285004.html

你可能感兴趣的文章
第二天简书
查看>>
iptables 用法
查看>>
POJ 3670 DP LIS?
查看>>
空心菱形的显示
查看>>
Eclipse 常用快捷键清单
查看>>
redis 存储时间区间的数据
查看>>
STM32F0库函数初始化系列:进入STOP模式,外部中断唤醒
查看>>
p1525 关押罪犯
查看>>
使用Html5shiv.js让ie支持html5
查看>>
DBA 优化法则
查看>>
用Python连接SQLServer抓取分析数据、监控 (pymssql)
查看>>
升级ruby后再安装cocodPod
查看>>
MySQL数据库8(十三)高级数据操作之select指令
查看>>
随心测试_Python Se_002<不同浏览器驱动>
查看>>
在ASP.NET WebService 中如何使用 WebMethod 属性
查看>>
一个很详细的web.xml讲解
查看>>
ArcGIS 《空间分析使用手册》的一些内容(分配函数、成本加权距离制图、单元统计、邻域统计等等)...
查看>>
福大软工1816 · 第三次作业 - 结对项目1
查看>>
开发命名规范
查看>>
The connection to adb is down, and a severe error has occured.
查看>>