首页 > ACM题库 > 九度OJ > 九度-1178-复数集合[解题代码]
2013
12-13

九度-1178-复数集合[解题代码]

题目来源:2011年北京邮电大学网院研究生机试真题

题目描述:

    一个复数(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都是非负数。


java 代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.TreeSet;


public class Main{

	public static void main(String[] args) throws IOException {
		//System.out.print("abcd".indexOf('d'));
		Scanner s = new Scanner(System.in);
		
		while(s.hasNextInt()){
TreeSet set = new TreeSet();
			int n = s.nextInt();
//			String cmds[] = new String[n];
			for(int i=0; i<n; i++){
				String cmd = s.next();
				if(cmd.equals("Pop")){
					if(set.size() == 0)
						System.out.println("empty");
					else{
						System.out.println(set.pollLast());
						System.out.println("SIZE = "+set.size());
					}
				}
				else if(cmd.equals("Insert")){
					String temp = s.next().replace("+i", " ");
					Scanner scn = new Scanner(temp);
					int a = scn.nextInt();
					int b = scn.nextInt();
					Num num = new Num(a,b);
					set.add(num);
					System.out.println("SIZE = "+set.size());
				}
			}
		}
	
	}

}

class Num implements Comparable<Num>{
	int i;
	int j;
	public Num(int i,int j){
		this.i = i;
		this.j = j;
	}
	
	@Override
	public String toString() {
		return i+"+i"+j;
	}

	@Override
	public int compareTo(Num num) {
		if(this.i*this.i+this.j*this.j > num.i*num.i+num.j*num.j)
			return 1;
		else if(this.i*this.i+this.j*this.j == num.i*num.i+num.j*num.j){
			if(this.j > j)
				return 1;
			else
				return -1;
		}
		else
			return -1;
	}
	
	
}	
/**************************************************************
	Problem: 1178
	User: coder
	Language: Java
	Result: Accepted
	Time:1820 ms
	Memory:59704 kb
****************************************************************/


  1. 在方法1里面:

    //遍历所有的边,计算入度
    for(int i=0; i<V; i++)
    {
    degree = 0;
    for (j = adj .begin(); j != adj .end(); ++j)
    {
    degree[*j]++;
    }
    }

    为什么每遍历一条链表,要首先将每个链表头的顶点的入度置为0呢?
    比如顶点5,若在顶点1、2、3、4的链表中出现过顶点5,那么要增加顶点5的入度,但是在遍历顶点5的链表时,又将顶点5的入度置为0了,那之前的从顶点1234到顶点5的边不是都没了吗?

  2. 我没看懂题目
    2
    5 6 -1 5 4 -7
    7 0 6 -1 1 -6 7 -5
    我觉得第一个应该是5 6 -1 5 4 输出是19 5 4
    第二个是7 0 6 -1 1 -6 7输出是14 7 7
    不知道题目例子是怎么得出来的