[백준] 27377: 읽씹 멈춰! - JAVA
https://www.acmicpc.net/problem/27377
풀이
그리디문제였다.
n개를 채워야 하는데 1번 추가는 s초, 현재 개수 곱하기 2는 t초가 걸린다.
최소 시간을 구하는 문제이다.
n개부터 시작하여 -1, /2 하면서 0으로 만들면 된다.
n이 홀수일때는 -1 을 해야하고,
n이 짝수일때는 n / 2 * s 가 t보다 크다면 /2해주고, 아니라면 -1로 n을 채운다.
s와 t가 10의 9제곱, n이 10의 18제곱이기때문에 BigInteger를 사용해야 한다.
메모리: 325656KB
시간: 1380ms
언어: Java 11
코드
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
for (int tc = 0; tc < T; tc++) {
long n = Long.parseLong(br.readLine());
st = new StringTokenizer(br.readLine());
BigInteger s = new BigInteger(st.nextToken());
BigInteger t = new BigInteger(st.nextToken());
BigInteger ans = BigInteger.ZERO;
while (n > 0) {
if (n % 2 == 1) {
n -= 1;
ans = ans.add(s);
} else {
BigInteger num = new BigInteger(String.valueOf(n));
if (num.multiply(s).divide(BigInteger.TWO).compareTo(t) > 0) {
ans = ans.add(t);
} else {
ans = ans.add(s.multiply(num.divide(BigInteger.TWO)));
}
n /= 2;
}
}
sb.append(ans).append("\n");
}
System.out.println(sb);
}
}