总时间限制: 1000ms 内存限制: 256000kB
描述
如果说考试还会受到天赋的影响,那最公平的游戏就非抽奖莫属了。
输入
第一行输入一个整数 N,代表操作的总数
接下来的 N 行中,第 i 行包含两个整数,分别为操作码 p 和操作数 k
操作码 p 定义如下:
0: 将号码 k 添加到记录中(忽略重复)
1: 将号码 k 从记录中删除
2: 宣布记录中第 k 大的号码中奖(保证该号码存在)
保证输入的操作码一定在上述定义中。
除满足上述条件外,0 < N <= 100000, -1000000000 <= k <= 1000000000
输出
对于每一个操作,若 p = 0 或 p = 1,不进行输出
对于每一个操作,若 p = 2,输出一行,包含一个整数,为该操作选出的中奖号码
样例输入
8
0 1
0 2
0 2
0 3
2 3
1 2
2 2
2 1
样例输出
1
1
3
代码(TLE)
超出时间限制了,但测试用例是对的,里面vector的用法可以借鉴
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int mysort(int a1, int a2)
{
return(a1 > a2);
}
int main()
{
vector<int> arr;
//输入总数
int total;
cin >> total;
//循环
int i;
int p, k;
std::vector<int>::iterator pos;
for (i = 0; i < total; i++)
{
cin >> p >> k;
if (p == 0)//添加
{
//排除重复元素
pos = find(arr.begin(), arr.end(), k);
if (pos == arr.end())
{
arr.push_back(k);
}
}
else if (p == 1)//删除k
{
pos = find(arr.begin(), arr.end(), k);
if (pos != arr.end())
{
arr.erase(pos);
}
}
else if (p == 2)//中奖
{
//排序
sort(arr.begin(), arr.end(), mysort);
//找位置输出
cout << arr[k - 1] << "\n";
}
}
system("pause");
}