首页 > ACM题库 > 九度OJ > 九度-1013-开门人和关门人[解题代码]
2013
12-12

九度-1013-开门人和关门人[解题代码]

题目来源:2005年浙江大学计算机及软件工程研究生机试真题

题目描述:
    每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。
输入:

    测试输入的第一行给出记录的总天数N ( N> 0 ),下面列出了N天的记录。
    每天的记录在第一行给出记录的条目数M (M > 0 ),下面是M行,每行的格式为

    证件号码 签到时间 签离时间

    其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

输出:

    对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
    注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,且没有多人同时签到或者签离的情况。

样例输入:
3
1
ME3021112225321 00:00:00 23:59:59
2
EE301218 08:05:35 20:56:35
MA301134 12:35:45 21:40:42
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40
样例输出:
ME3021112225321 ME3021112225321
EE301218 MA301134
SC3021234 CS301133

java 代码如下:
import java.io.BufferedInputStream;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
	static TreeMap<String,String> map;
	public static void main(String[] args) {
		Scanner s = new Scanner(new BufferedInputStream(System.in));
		while(s.hasNextInt()){
			int n = s.nextInt();
			for(int i=0; i<n; i++){
				map = new TreeMap<String,String>();
				int m = s.nextInt();
				for(int j=0; j<m; j++){
					String s1 = s.next();
					String s2 = s.next();
					String s3 = s.next();
					map.put(s2, s1);
					map.put(s3, s1);
				}
				System.out.println(map.get(map.firstKey())+" "+map.get(map.lastKey()));
			}
		}
	}
}

/**************************************************************
	Problem: 1013
	User: coder
	Language: Java
	Result: Accepted
	Time:170 ms
	Memory:16004 kb
****************************************************************/


  1. I like your publish. It is great to see you verbalize from the coronary heart and clarity on this essential subject matter can be easily noticed.

  2. 在方法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的边不是都没了吗?