采用优先队列,元素乘-1再入队,取巧地在优先队列默认大根堆的情况下实现了小根堆,最后别忘乘回来-1即可。
第k小,但相同的元素算同1个,也就是只有所有相同元素都从优先队列pop出去后,才i++。
#include <queue>
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
priority_queue<int> myPriorityQueue;
for(int i = 0;i<n;i++){
int num;
cin>>num;
myPriorityQueue.push(num*(-1));
}
int k;
cin>>k;
for(int i = 0;i<k-1;){//把第k小之前的都出队
//但是要实现相同大小算一样大,所以要前后比较,分情况讨论
int curnum1 = myPriorityQueue.top();
myPriorityQueue.pop();
int curnum2 = myPriorityQueue.top();
if(curnum1 == curnum2){
//如果当前top出的元素与下一个队首元素=,则i不增加
continue;
}
else{
//只有当当前top出的元素已经是与它相同的最后一个,再i++
i++;
}
}
int answer = myPriorityQueue.top()*(-1);
printf("%d\n",answer);
}
}

京公网安备 11010502036488号