컴굥일지
[BOJ/백준 15903][C++] 카드 합체 놀이 본문
반응형
문제
https://www.acmicpc.net/problem/15903
문제 내용
입력받은 원소 n개짜리 배열에 대해, 아래 과정을 m번 수행하면 된다.
1. x번 카드와 y번 카드를 골라 그 두 장에 쓰여진 수를 더한 값을 계산한다. (x ≠ y)
2. 계산한 값을 x번 카드와 y번 카드 두 장 모두에 덮어 쓴다.
m번의 과정이 모두 끝나고, 전체 원소의 합이 최소가 되도록 해야 한다.
문제 풀이
x와 y를 골라 두 값을 더해 카드를 덮어써야 한다.
즉, x와 y의 값은 기존과 같거나 커지게 된다. (값이 줄어드는 경우는 없다)
전체 합이 최소가 되게 하기 위해선, 매 과정마다 가장 작은 두 수를 x, y로 골라야 한다.
코드
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
long long arr[n];
for (int i = 0; i < n; i++)
cin >> arr[i];
long long sumXY = 0;
while (m--) {
sort(arr, arr + n);
sumXY = arr[0] + arr[1];
arr[0] = arr[1] = sumXY;
}
long long sumTotal = 0;
for (int i = 0; i < n; i++)
sumTotal += arr[i];
cout << sumTotal;
}
문제 코드 설명
n의 범위는 2~1000, m의 범위는 0~15*n, 카드의 원소는 1~10^6까지이다.
따라서 배열과 원소의 합을 관리하는 변수의 자료형은 int가 아니라 long long으로 한다.
반응형
'알고리즘 > 코테 문제' 카테고리의 다른 글
[BOJ/백준 2667][C++] 단지번호붙이기 (0) | 2023.07.22 |
---|---|
[BOJ/백준 1992][C++] 쿼드트리 (0) | 2023.07.22 |
[BOJ/백준 1780][C++] 종이의 개수 (0) | 2023.07.20 |
[BOJ/백준 14889][C++] 스타트와 링크 (0) | 2023.07.20 |
[BOJ/백준 7562][C++] 나이트의 이동 (0) | 2023.07.19 |
Comments