【北邮复试机试】复数集合

时间限制: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时=前后都有空格。坑。。。

猜你喜欢

转载自blog.csdn.net/m0_38103546/article/details/79683811
今日推荐