Algorithm
[Algo] 백준 24913 개표 JAVA
조핑구
2024. 5. 8. 13:39
문제 바로가기 : https://www.acmicpc.net/problem/24913
메모리 : 99204KB
시간 : 656ms
언어 : Java 11
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 후보
int Q = Integer.parseInt(st.nextToken()); // 개표
long[] person = new long[N + 2];
StringBuilder sb = new StringBuilder();
long sum = 0;
long max = 0;
for (int q = 0; q < Q; q++) {
st = new StringTokenizer(br.readLine());
int order = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
if (order == 1) {
person[y] += x;
if (y != N + 1) {
sum += x;
max = Math.max(max, person[y]);
}
} else {
long jung = person[N + 1] + x;
long tmp = (sum + y) / N;
if ((sum + y) % N != 0) {
tmp += 1;
}
if (jung <= max) {
sb.append("NO").append("\n");
} else if (jung <= tmp) {
sb.append("NO").append("\n");
} else {
sb.append("YES").append("\n");
}
}
}
System.out.print(sb);
}
}
풀이
맨 처음에 당선이 될 수 있는 경우를 찾으려했는데ㅜㅜ 너무 복잡했다..
당선이 되지 않는 경우를 생각해서 구현하면 더 쉬웠다.
- 1~N번의 후보보다 정후의 득표가 높은 경우
- 추가표를 나눠가져도 정후의 득표가 높은 경우
- 추가표를 최소로 얻는 경우는 (1~N까지의 득표 합+추가표) / N 이다.