时间限制:1秒
空间限制:65536K
热度指数:3106
算法知识视频讲解
题目描述
一个复数(x+iy)集合,两种操作作用在该集合上: 1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出 empty ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE; 2 Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE; 最开始要读入一个int n,表示接下来的n行每一行都是一条命令。
输入描述:
输入有多组数据。 每组输入一个n(1<=n<=1000),然后再输入n条指令。
输出描述:
根据指令输出结果。 模相等的输出b较小的复数。 a和b都是非负数。
示例1
输入
3 Pop Insert 1+i2 Pop
输出
empty SIZE = 1 1+i2 SIZE = 0
package test;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class complexcollection {
public static void main(String[] args) {
// TODO Auto-generated method stub
PriorityQueue<complex> queue=new PriorityQueue<>(complexComparator);
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
scanner.nextLine();
for (int i = 0; i < n; i++) {
String string=scanner.nextLine();
if (string.equals("Pop")) {
if (queue.size()==0) {
System.out.println("empty");
}else {
complex c=queue.poll();
System.out.println(c.real+"+i"+c.virtual);
System.out.println("SIZE = "+queue.size());
}
}else {
String s[]=string.split(" ");
int indexofplus=s[1].indexOf("+");
int a=Integer.valueOf(s[1].substring(0,indexofplus));
int b=Integer.valueOf(s[1].substring(indexofplus+2));
complex c1=new complex(a, b);
queue.add(c1);
System.out.println("SIZE = "+queue.size());
}
}
}
public static Comparator<complex> complexComparator=new Comparator<complex>() {
public int compare(complex c1, complex c2) {
if (c1.model!=c2.model) {
return c1.model>c2.model? -1:1;
}else {
return c1.virtual<c2.virtual? 1:-1;
}
};
};
}
class complex{
int virtual;
int real;
int model;
public complex(int a,int b) {
virtual=b;
real=a;
model=a*a+b*b;
}
}
使用优先队列对复数进行排序,定义排序规则。
另外:输出的size时=前后都有空格。坑。。。