AOJ1315 Gift from the Goddess of Programming

問題リンク Gift from the Goddess of Programming

  • 概要

ログイン・ログアウトのログ記録がN個ある。ログ記録には「日 時間 IorO ID」が記録されている。Iはログイン、Oはログアウトを表す。神様のIDは"000"である。このとき、神様と一緒にログインしていた時間の累積和Tが最も多かったユーザのTを分単位で答えよ。なお、このシステムはメンテナンスのために00:00に一旦落ちるため、日をまたがってログインし続けることはできない。
N <= 1000

  • 解法

日をまたがることが無いのでログの「日」の情報は無価値です。
各ユーザに対してログインした時間を記録しておき、ログアウトを表すログをトリガとして各ユーザのログイン時間を計算します。
ログアウトしたユーザが神様のとき、そのときにログインしている全ての人のログイン時間を加算します。
神様以外の時、さらにその時神様がログインしていればそのユーザのログイン時間を計算します。

  • ソース
import java.util.Scanner;

//Gift from the Goddess of Programming
public class AOJ1315 {

	void run(){
		Scanner sc = new Scanner(System.in);
		for(;;){
			int n = sc.nextInt();
			if(n==0)break;
			int[] s = new int[1000], in = new int[1000];
			boolean[] f = new boolean[1000];
			while(n--!=0){
				sc.next();
				String[] t = sc.next().split(":");
				int time = Integer.parseInt(t[0])*60+Integer.parseInt(t[1]);
				boolean I = "I".equals(sc.next());
				int id = sc.nextInt();
				if(I){
					f[id] = true; in[id] = time;
				}
				else{
					f[id] = false;
					if(id==0){
						for(int i=1;i<1000;i++)if(f[i])s[i]+=time-Math.max(in[0], in[i]);
					}
					else if(f[0])s[id]+=time-Math.max(in[0], in[id]);
				}
			}
			int res = 0;
			for(int i=1;i<1000;i++)res=Math.max(res, s[i]);
			System.out.println(res);
		}
	}
	
	public static void main(String[] args) {
		new AOJ1315().run();
	}
}