728x90
https://www.acmicpc.net/problem/15903
15903번: 카드 합체 놀이
첫 번째 줄에 카드의 개수를 나타내는 수 n(2 ≤ n ≤ 1,000)과 카드 합체를 몇 번 하는지를 나타내는 수 m(0 ≤ m ≤ 15×n)이 주어진다. 두 번째 줄에 맨 처음 카드의 상태를 나타내는 n개의 자연수 a1,
www.acmicpc.net
풀이)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main_BJ_15903_카드합체놀이 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
PriorityQueue<Long> pq = new PriorityQueue<>();
st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++)
pq.offer(Long.parseLong(st.nextToken()));
int cnt = 0;
while(cnt < m){
long a = pq.poll();
long b = pq.poll();
pq.offer(a+b);
pq.offer(a+b);
cnt++;
}
long sum = 0;
int size = pq.size();
for(int i=0; i<size; i++)
sum += pq.poll();
System.out.println(sum);
}//main
}
해당 문제는 그리디로 푸는 문제로, priority queue를 사용하면 쉽게 풀 수 있다!
카드에서 작은 순서대로 정렬을 한 후, 앞에서 2개를 뽑아 더한 수를 다시 pq에 넣어두면, 다시 정렬이 된다.
이 과정을 m번 반복하면 끝!
728x90
'코테 > 백준' 카테고리의 다른 글
백준 14503 로봇 청소기(JAVA) (0) | 2023.04.04 |
---|---|
백준 1245 농장 관리(JAVA) (0) | 2023.04.04 |
백준 2217 로프(JAVA) (0) | 2023.04.02 |
백준 1932 정수 삼각형(JAVA) (0) | 2023.03.30 |
백준 1966 프린터 큐(JAVA) (0) | 2023.03.28 |