动态k小

题目:

 这道题目十分简单,只要用大根堆维护前k小的数字即可,用大根堆是因为方便输出(用小根堆需要输出堆底),前k个先单独输入,不输出(第k个除外,单独输出) ,之后k+1~n如果输入进来的数字比堆顶大,直接跳过,否则先把原堆顶弹出再推入输入进来的数字,每一次输出堆顶即可。

大根堆与小根堆及优先队列

程序:

#include<bits/stdc++.h>
using namespace std;
long long n,k,t;
priority_queue<long long> q;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=k;i++) cin>>t,q.push(t);
    printf("%d\n",q.top());
    for(long long i=k+1;i<=n;i++)//  2 1
    {
        cin>>t;
        if(t<q.top()) q.pop(),q.push(t);
        printf("%d\n",q.top());
    }
    return 0;
}

 

posted @ 2023-04-29 22:32  王浩泽  阅读(263)  评论(0编辑  收藏  举报