首页 > 其他题解 > 复数集合(优先队列)

复数集合(优先队列)

题目描述
一个复数(x+iy)集合,两种操作作用在该集合上:
1. Pop 表示读出集合中复数模值最大的那个复数,如集合为空输出empty,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE;
2. Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE;
最开始要读入一个int n,表示接下来的n行每一行都是一条命令。
输入
输入有多组数据。
每组输入一个n(1小于等于n小于等于1000),然后再输入n条指令。
输出
根据指令输出结果。
样例输入
3
Pop
Insert 1+i2
Pop
样例输出
empty
1+i2
(输出有点小问题,这里insert的时候题目没有按照要求输出size了;一看题目就知道是优先队列了,还好STL提供了强大的优先队列给我们使用,如果时间紧张就没有必要自己写了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Author: 代码疯子
// C++优先队列
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <cstring>
#include <iterator>
using namespace std;
 
class Node
{
public:
	char str[80];
	int len;
public:
	bool operator<(const Node& rhs) const
	{
		return this->len < rhs.len;
	}
};
 
int main(int argc, char **argv)
{
	int n, i;
	while (EOF != scanf("%d%*c", &n))
	{
		priority_queue<Node> pqueue;
		char op[100] = {0};
		int x, y;
		Node node;
		for (i = 0; i < n; ++i)
		{
			scanf("%s", op);
			if (!strcmp(op, "Pop"))
			{
				if (pqueue.empty())
				{
					printf("empty\n");
				}
				else
				{
					node = pqueue.top();
					pqueue.pop();
					printf("%s\n", node.str);
				}
			}
			else
			{
				scanf("%d+i%d%*c", &x, &y);
				node.len = x*x + y*y;
				sprintf(node.str, "%d+i%d", x, y);
				pqueue.push(node);
				// 题目输出数据格式有误
				// printf("%d\n", pqueue.size());
			}
		}
	}
	return 0;
}

觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 复数集合(优先队列)
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: 其他题解 标签: , ,
  1. 本文目前尚无任何评论.