1 条题解
-
0
自动搬运
来自洛谷,原作者为

_neddy
**搬运于
2025-08-24 21:36:55,当前版本为作者最后更新于2019-05-02 13:27:28,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这道题坑点还是挺多的,前后交了二十多次终于成功。
大法好!
方法如下:
- 开两个优先队列,一个大根堆一个小根堆
priority_queue<int, vector<int>, less<int> > a; //大根 priority_queue<int, vector<int>, greater<int> > s; //小根- 把输入的前个数塞进大根堆
for (register int i = 1; i <= m; ++i) { int num; scanf("%d", &num); //优先队列不能直接输入堆顶 a.push(num); //只能用中间变量输入 //然后再进堆 }- 对接下来的个数进行筛选,如果比大根堆的根小,就去除根,并把这个数塞进去
for (register int i = m + 1, num; i <= n; ++i) { scanf("%d", &num); if (num < a.top()) a.pop(), a.push(num); }- 把大根堆里的数倒进小根堆里
for (register int i = 1; i <= m; ++i) { s.push(a.top()); //大根堆堆顶倒入小根堆 a.pop(); //大根堆堆顶出堆 }- 输出即可。
完整代码如下:
#include <stdio.h> #include <queue> #include <algorithm> using namespace std; priority_queue<int, vector<int>, less<int> > a; priority_queue<int, vector<int>, greater<int> > s; int maxn; int main() { int n, m, miss = 0; scanf("%d %d", &n, &m); for (register int i = 1; i <= m; ++i) { int num; scanf("%d", &num); a.push(num); } for (register int i = m + 1, num; i <= n; ++i) { scanf("%d", &num); if (num < a.top()) { a.pop(); a.push(num); } } for (register int i = 1; i <= m; ++i) { s.push(a.top()); a.pop(); } while(s.size()) printf("%d\n", s.top()), s.pop(); }求过求顶,让更多的人看到。
拒绝抄袭。
- 1
信息
- ID
- 1373
- 时间
- 1000ms
- 内存
- 4MiB
- 难度
- 2
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者