<모든 문제는 C++를 기반으로 풀이한다.>
2 4 5 4 6
을 예로들어보자. 정렬하면, 2 4 4 5 6
이 되고, M = 8, K = 3
일 때, 우리는 가장 큰 수 6
을 3번 더하고 5
를 1번 더하고 다시 6
을 3번 더하고 5
를 1번 더하면 된다. #include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int N = 0, M = 0, K = 0; // 배열크기, 덧셈회수, 연속가능개수
cin >> N >> M >> K;
int arr[N];
for (int i = 0; i < N; ++i) cin >> arr[i];
sort(arr, arr + N); // 정렬한다. 제일 큰 두 요소만 필요하다.
int ans = ((M / (K + 1)) * (K * arr[N - 1] + arr[N - 2])) + (M % (K + 1)) * arr[N - 1];
cout << ans << '\n';
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int row = 0, col = 0; cin >> row >> col;
vector<int> smallestArr;
for (int y = 0; y < row; ++y) {
int rowSmallestElem = INT16_MAX;
for (int x = 0; x < col; ++x) {
int elem = 0; cin >> elem;
rowSmallestElem = min(rowSmallestElem, elem);
} // 각 행에서 가장 작은 원소를 찾은 뒤 배열에 넣는다.
smallestArr.push_back(rowSmallestElem);
}
sort(begin(smallestArr), end(smallestArr));
cout << smallestArr.back() << '\n';
}
Greedy
에 따라 1을 감산하는 것 보다 K로 나누는게 훨씬 빠르다라는 것을 떠올릴 수 있다. 그러므로 우리는 가능한 한 많이 K로 나눠야 한다.#include <iostream>
using namespace std;
int main() {
int N = 0, K = 0; cin >> N >> K;
int ans = 0;
while (N != 1) { // 기저: N이 1이 될 때까지 반복한다.
if (N % K == 0) N /= K; // 나누어 떨어지면 방법 2 사용
else N--; // 아니면 방법 1 사용
ans++;
}
cout << ans << '\n';
}