-
Notifications
You must be signed in to change notification settings - Fork 4
/
ContestScoreboard.java
100 lines (90 loc) · 3.25 KB
/
ContestScoreboard.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toList;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ContestScoreboard {
private static final BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in));
private static class Team implements Comparable<Team> {
private final int num;
private int totalTime;
private Set<Integer> solved = new HashSet<>();
private final int[] penalties = new int[10];
@Override
public String toString() {
return num + " " + solved.size() + " " + getTotalTime();
}
public Team(int num) {
this.num = num;
}
public int getTotalTime() {
int time = totalTime;
for (Integer problemId : solved) {
time += penalties[problemId];
}
return time;
}
public void update(Integer problem, Integer time, String verdict) {
switch (verdict) {
case "C":
if (solved.add(problem)) {
totalTime += time;
}
break;
case "I":
if (!solved.contains(problem)) {
penalties[problem] += 20;
}
break;
default:
break;
}
}
@Override
public int compareTo(Team o) {
int solvedCmp = Integer.compare(o.solved.size(),
this.solved.size());
if (solvedCmp == 0) {
int timeCmp = Integer.compare(getTotalTime(), o.getTotalTime());
if (timeCmp == 0) {
return Integer.compare(this.num, o.num);
}
return timeCmp;
}
return solvedCmp;
}
}
public static void main(String[] args) throws IOException {
int cases = Integer.parseInt(reader.readLine().trim());
reader.readLine();
String currentLine = null;
for (int i = 0; i < cases; ++i) {
Map<Integer, Team> participants = new HashMap<>();
while ((currentLine = reader.readLine()) != null &&
!currentLine.trim().equals("")) {
List<String> inputLine = stream(currentLine.trim().split(" "))
.filter(x -> !x.equals(""))
.collect(toList());
Integer num = Integer.parseInt(inputLine.get(0));
Integer problem = Integer.parseInt(inputLine.get(1));
Integer time = Integer.parseInt(inputLine.get(2));
String verdict = inputLine.get(3);
if (!participants.containsKey(num)) {
participants.put(num, new Team(num));
}
participants.get(num).update(problem, time, verdict);
}
participants.values().stream().sorted()
.forEach(System.out::println);
if (i < cases - 1) {
System.out.println();
}
}
}
}