-
题目描述:
-
一个复数(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 SIZE = 1 1+i2 SIZE = 0
-
提示:
-
模相等的输出b较小的复数。
a和b都是非负数。
import java.io.IOException;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.lang.Comparable;
import java.util.PriorityQueue;
class Main
{
public static final boolean DEBUG = false;
static class Complex implements Comparable<Complex>
{
int x, y;
public Complex(int x, int y) {
this.x = x;
this.y = y;
}
public int compareTo(Complex other) {
int p = x * x + y * y;
int q = other.x * other.x + other.y * other.y;
if (p != q) return q - p;
return y - other.y;
}
}
public static void main(String[] args) throws IOException
{
BufferedReader cin;
String s;
if (DEBUG) {
cin = new BufferedReader(new FileReader("d:\\OJ\\uva_in.txt"));
} else {
cin = new BufferedReader(new InputStreamReader(System.in));
}
while ((s = cin.readLine()) != null) {
int n = Integer.valueOf(s);
PriorityQueue<Complex> pq = new PriorityQueue<Complex>();
for (int i = 0; i < n; i++) {
s = cin.readLine();
if ("Pop".compareTo(s) == 0) {
if (pq.isEmpty()) {
System.out.println("empty");
} else {
Complex tmp = pq.poll();
System.out.println(tmp.x + "+i" + tmp.y);
System.out.println("SIZE = " + pq.size());
}
} else {
int start = s.indexOf(' ') + 1;
int end = s.indexOf('+');
int x = Integer.valueOf(s.substring(start, end));
int y = Integer.valueOf(s.substring(end + 2));
Complex tmp = new Complex(x, y);
pq.add(tmp);
System.out.println("SIZE = " + pq.size());
}
}
}
}
}