※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 16206번 문제인 롤케이크이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/16206 

 

16206번: 롤케이크

오늘은 재현이의 생일이다. 재현이는 친구 N명에게 롤케이크를 1개씩 선물로 받았다. 롤케이크의 길이는 A1, A2, ..., AN이다. 재현이는 길이가 10인 롤케이크만 먹는다. 따라서, 롤케이크를 잘라서

www.acmicpc.net

길이가 10k(k는 양의 정수)인 롤케이크를 k-1회 쪼개면 길이 10의 롤케이크를 k개 얻을 수 있음을 관찰하자. 즉, 일반적으로는 롤케이크 쪼개기를 한 번 해서는 새로운 길이 10의 조각을 하나만 얻을 수 있지만 길이가 10의 배수인 롤케이크를 쪼갠다면 덤으로 하나의 조각을 더 얻을 수 있음을 관찰하자.

 

따라서, 길이가 짧은 길이 10의 배수의 롤케이크부터 차례대로 케이크를 쪼개나가는 것을 시도하는 것으로 문제의 답을 구해낼 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, M;
vector<int> vec10;
int ans, cnt;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M;
	while (N--) {
		int x; cin >> x;
		if (x % 10) cnt += x / 10;
		else vec10.emplace_back(x);
	}

	sort(vec10.begin(), vec10.end(), greater<int>());

	while (!vec10.empty()) {
		int cur = vec10.back() / 10; vec10.pop_back();
		if (cur - 1 <= M) M -= (cur - 1), ans += cur;
		else {
			ans += M;
			M = 0;
			break;
		}
	}

	ans += min(cnt, M);

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 3024 // C++] 마라톤 틱택토  (0) 2023.09.17
[BOJ 22487 // C++] Do use segment tree  (0) 2023.09.16
[BOJ 16207 // C++] 직사각형  (0) 2023.09.14
[BOJ 16210 // C++] DSHS Bank  (0) 2023.09.13
[BOJ 16209 // C++] 수열 섞기  (0) 2023.09.12

+ Recent posts