题解:P1923 【深基9.例4】求第 k 小的数
切水题ing,好的这里是传送门。
突然来做这题的原因是机房同学不知为何发现这题然后自信打上 sort 然后爆两个点发现蜜汁数据
其实不用看上面的。分割线~~~
#
看到这题苦思冥想半天,虽然拼尽全力无法得出
堆的用法不必多说,我们希望最后
算法流程:取前
使用堆的时间复杂度会比线段树、快速排序的小一些。因为在数据随机的情况下有些数不会进堆,即使遇到极端数据如单调下降数列,我们也可以通过在一开始时随机插入
当然本题不需要,但这个思想还蛮好的?
以下为代码,堆用 STL 优先队列代替。
# include <iostream>
# include <queue>
using namespace std;
int a[5000005];
bool check[5000005];
priority_queue<int,vector<int>,less<int> > q;
int main (void)
{
int n,k;
scanf ("%d %d",&n,&k);
k++;
for (int i=1;i<=n;i++)
{
scanf ("%d",&a[i]);
}
for (int i=1;i<=n;i++)
{
if (q.size() < k)
{
q.push(a[i]);
}
else if (a[i] < q.top())
{
q.pop();
q.push(a[i]);
}
}
printf ("%d",q.top());
return 0;
}