小猴编程周赛C++ | 前缀第k大

学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!

附上汇总贴:小猴编程C++ | 汇总-CSDN博客


【题目描述】
给出一个数列 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,,an,保证数列中的数互不相同。再给一个正整数k。对i=k,k+1,…,n求:
将数列a的前i项从大到小排序后,第k个数的值。
【输入】
第1行,2个正整数n,k。
第2行,n个正整数 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,,an
【输出】
对i=k,k+1,…,n每个i,用一行输出答案。
【输入样例】

3 2
1 2 3

【输出样例】

1
2

【代码详解】
[图片]

#include <bits/stdc++.h>
#include <queue>
using namespace std;
const int N = 500005;
int n, k, a[N];
priority_queue<int, vector<int>, greater<int> > p;  // 小根堆,最后"> >"中需有个空格
// priority_queue<int> p; // 大根堆,或写成priority_queue<int, vector<int>, less<int> > p; 
int main()
{
    cin >> n >> k;
    for (int i=1; i<=n; i++) {  // 遍历n个数
        cin >> a[i];  // 输入a[i]
        if (i<=k) {  // 在i小于等于k时
            p.push(a[i]);  // a[i]就被放入小根堆队列中
            if (i==k) cout << p.top() << endl;  // i<k时,无任何输出,i==k时,输出队列中最小值
            continue;
        }
        int x = p.top();  // 取出最小值
        if (a[i]>x) {  // 如果输入的值大于x(不可能等于,因为所有值唯一)
            p.pop();  // 最小值就被弹出,因为第k大会变为第k+1大
            p.push(a[i]);  // 将a[i]压队
        }
        cout << p.top() << endl;  // 输出最小值
    }
    return 0;
}

【运行结果】

3 2
1 2 3
1
2
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值