队列以及集合size()的应用

时间:2021-06-02 17:38:49

题目————hdu;4006;
http://acm.hdu.edu.cn/showproblem.php?pid=4006
题目大意;
输入两个数 n和k
k表示输出第k大的数;
接下来输入n行;
I X代表加入一个数I;
Q 表示输出;输出第k大的数;

根据题意;要知道运用到队列或者重复集合,限制第k大就是将他们的size()限制到k则ok;最后只需输出首元素即可;
队列代码;

#include <stdio.h>
#include <queue>
#include <iostream>
#include<string.h>
using namespace std;

int main()
{
int n,k,x;
char c;
while(scanf("%d%d",&n,&k)!=EOF){

priority_queue<int,vector<int>,greater<int> > q;
for(int i=0;i<n;i++){
getchar();
scanf("%c",&c);
if(c=='I'){
scanf("%d",&x);
q.push(x);
if(q.size()>k) q.pop();
}
else printf("%d\n",q.top());
}
}
return 0;
}

重复集合代码;

#include<stdio.h>
#include<set>
#include<string.h>
using namespace std;
int main()
{
int i, n, k,a;
char ch,c;
multiset<int> s;
multiset<int>::iterator it;
while(~scanf("%d %d",&n, &k))
{
s.clear();//多重集合要注意clear;
for(i = 0; i < n; i++)
{
c = getchar();
scanf("%c",&ch);

if(ch == 'I')
{
scanf("%d",&a);
s.insert(a);
if(s.size() > k)
{
s.erase(s.begin());
}
}
if(ch == 'Q')
{
it = s.begin();
printf("%d\n",*it);
}
}
}
return 0;
}