https://www.acmicpc.net/problem/15903
시간 1초, 메모리 512MB
input :
output :
조건 :
현재 배열에 존재하는 수 중 가장 작은 두 수를 골라 합하게 하면 모든 수의 합을 구했을 때 가장 작은 값을 구할 수 있다.
우선순위 큐를 사용해서 가장 앞의 두 값을 취한 후 더한 값을 2개 넣어주는 식으로 수행,
그리고 마지막에 모든 값을 더하게 하자.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class BOJ_15903_duplicate {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PriorityQueue<Long> data = new PriorityQueue<>();
public static void main(String[] args) throws IOException {
String[] temp = br.readLine().split(" ");
int m = Integer.parseInt(temp[1]);
temp = br.readLine().split(" ");
for (String item : temp)
data.add(Long.parseLong(item));
for (int i = 0; i < m; i++){
long a = data.poll();
long b = data.poll();
data.add(a + b);
data.add(a + b);
}
long ans = 0;
for (Long n : data)
ans += n;
System.out.println(ans);
}
}
그리고, 카드에 들어있는 숫자의 범위가 1백만인데 이 숫자가 1000개 있다면 int 범위를 넘어가니, long 자료형을 사용하자.