※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 23322번 문제인 초콜릿 뺏어 먹기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/23322
23322번: 초콜릿 뺏어 먹기
연두는 $N$개의 통에 초콜릿을 담아서, 초콜릿의 개수가 오름차순이 되도록 일렬로 배열해 놓는다. 즉, ($1$번째 통의 초콜릿의 개수) $\le$ ($2$번째 통의 초콜릿의 개수) $\le \dots \le$ ($N$번째 통의
www.acmicpc.net
다음과 같은 전략으로 초콜릿을 먹는다면 항상 가장 많은 초콜릿을 최소 횟수로 먹을 수 있다.
1) K+1, K+2, ..., K+i, ..., N번째 통의 초콜릿을 (먹을 게 있다면) 차례대로 먹는다. 이 과정에서 i번째로 먹은 초콜릿통에 남은 초콜릿의 개수는 첫번째 통의 초콜릿의 개수와 같아진다. 또한 위 과정을 마치면 뒤의 K개의 통을 제외한 앞의 모든 통은 첫번째 통의 초콜릿과 같은 개수의 초콜릿이 남아있다는 것을 알 수 있다.
2) 이제 마지막 초콜릿통에 담겨있는 초콜릿의 개수가 첫번재 통에 남아있는 초콜릿 개수와 같아질 때까지 반복해서 먹는다.
이것이 최적이라는 것을 증명하는 것은 어렵지 않으므로 읽는이에게 남겨둔다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int N, K;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
int days = 0, cnt = 0;
int mn; cin >> mn;
for (int i = 1; i < N; i++) {
int x; cin >> x;
if (x > mn) days++, cnt += x - mn;
}
cout << cnt << ' ' << days;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 27245 // C++] Комната (0) | 2023.01.17 |
---|---|
[BOJ 27262 // C++] Лифт (0) | 2023.01.17 |
[BOJ 27239 // C++] Шахматная доска (0) | 2023.01.17 |
[BOJ 27272 // C++] Пары (0) | 2023.01.17 |
[BOJ 27159 // C++] 노 땡스! (0) | 2023.01.17 |