ACM练习 校赛183F:公平的游戏(TLE)【vector不重复添加、删除指定元素、排序】

总时间限制: 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");
}

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/89354626