学习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