首页 > ACM题库 > 九度OJ > 九度-1187-最小年龄的3个职工[解题代码]
2013
12-13

九度-1187-最小年龄的3个职工[解题代码]

题目来源:2003-2005年华中科技大学计算机研究生机试真题

题目描述:

职工有职工号,姓名,年龄.输入n个职工的信息,找出3个年龄最小的职工打印出来。

输入:

输入第一行包括1个整数N,1<=N<=30,代表输入数据的个数。
接下来的N行有N个职工的信息:
包括职工号(整数), 姓名(字符串,长度不超过10), 年龄(1<=age<=100)。

输出:

可能有多组测试数据,对于每组数据,
输出结果行数为N和3的较小值,分别为年龄最小的职工的信息。

关键字顺序:年龄>工号>姓名,从小到大。

样例输入:
5
501 Jack 6
102 Nathon 100
599 Lily 79
923 Lucy 15
814 Mickle 65
样例输出:
501 Jack 6
923 Lucy 15
814 Mickle 65

java 代码如下:
import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner s = new Scanner(new BufferedInputStream(System.in));
		while(s.hasNextInt()){
			int n = s.nextInt();
			P[] arr = new P[n];
			for(int i=0; i<n; i++){
				arr[i] = new P(s.nextInt(),s.next(),s.nextInt());
			}
			Arrays.sort(arr);
			if(n > 3)
				for(int i=0; i<3; i++){
					System.out.println(arr[i].id+" "+arr[i].name+" "+arr[i].age);
				}
			else
				for(int i=0; i<n; i++){
					System.out.println(arr[i].id+" "+arr[i].name+" "+arr[i].age);
				}
		}
	}

}

class P implements Comparable<P>{
	int id;
	int age;
	String name;
	public P(int id, String name,int age ) {
		this.id = id;
		this.age = age;
		this.name = name;
	}
	
	public int compareTo(P o) {
		if(this.age < o.age)
			return -1;
		else if(this.age == o.age){
			if(this.id < o.id)
				return -1;
			else if(this.id == o.id){
				return this.name.compareTo(o.name);
			}
		}
		return 1;
	}
	
}

/**************************************************************
	Problem: 1187
	User: coder
	Language: Java
	Result: Accepted
	Time:970 ms
	Memory:30836 kb
****************************************************************/


  1. 有两个重复的话结果是正确的,但解法不够严谨,后面重复的覆盖掉前面的,由于题目数据限制也比较严,所以能提交通过。已更新算法

  2. 题目需要求解的是最小值,而且没有考虑可能存在环,比如
    0 0 0 0 0
    1 1 1 1 0
    1 0 0 0 0
    1 0 1 0 1
    1 0 0 0 0
    会陷入死循环

  3. 嗯 分析得很到位,确实用模板编程能让面试官对你的印象更好。在设置辅助栈的时候可以这样:push时,比较要push的elem和辅助栈的栈顶,elem<=min.top(),则min.push(elem).否则只要push(elem)就好。在pop的时候,比较stack.top()与min.top(),if(stack.top()<=min.top()),则{stack.pop();min.pop();},否则{stack.pop();}.