题目传送:走你~
题意简介:写下很多很多的数,当遇到Q时输出第k大的数。
分析:很多很多的数,则开数组行不通,需要STL。输出第k大的数,则需要对原数据进行排序。如果强行暴力排序则会T掉,
而且用set时需要注意的一点是,set自动忽略相同的数,而根据题意需要相同的数这里用到了multiset.
法一:multiset
#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int maxn = 1000100;
multiset<int> se;
int n, k, a, b;
char ch;
multiset<int>::iterator it;
int main()
{
while(scanf("%d%d", &n, &k) != EOF)
{
se.clear(); // **不要忘记
a = 0;
for(int i = 0; i < n; i++)
{
getchar();
ch = getchar();
if(ch == 'I')
{
scanf("%d", &b);
se.insert(b);
a++;
it = se.begin();
if(se.size() > k) // 对set中数据进行维护,使他最多存有3个。
se.erase(it);
}
else
{
it = se.begin();
printf("%d\n",*it);
}
}
}
return 0;
}
法二:优先队列
#include<bits/stdc++.h>
using namespace std;
int n, k, d;
char ch;
int main()
{
while(scanf("%d%d", &n, &k) != EOF)
{
//其实和set很相似,简单的是方便维护最多3个数的队列
priority_queue<int, vector<int>, greater<int> > pre;
while(n--)
{
cin >> ch;
if(ch == 'I')
{
scanf("%d", &d);
pre.push(d);
if(pre.size() > k)
pre.pop();
}
else
{
printf("%d\n", pre.top());
}
}
}
return 0;
}
法三:vector+查找插入,使其在输入时本身就有序。
#include<bits/stdc++.h>
using namespace std;
int n, k, d;
vector <int> vec;
char ch;
int main()
{
while(scanf("%d%d", &n, &k) != EOF)
{
vec.clear();
while(n--)
{
cin >> ch;
if(ch == 'I')
{
scanf("%d", &d);
int pos = lower_bound(vec.begin(), vec.end(), d) - vec.begin();
vec.insert(vec.begin() + pos, d);
}
else
{
printf("%d\n", vec[vec.size() - k]);
}
}
}
return 0;
}