문제 링크
2343번 기타 레슨 : https://www.acmicpc.net/problem/2343
문제 설명 및 해결 아이디어
Parametric Search문제이다.
left의 범위는 레슨 중 가장 긴 길이부터 시작하면 된다.
mid를 lesson길이로 설정한다.
만들어진 블루레이 개수가 M보다 클 경우, mid를 크게하여 블루레이 개수를 줄인다.
만들어진 블루레이 개수가 M보다 작거나 같을 경우, mid를 작게하고, 이때의 mid값 중 최소값을 저장한다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <cstdio> #include <algorithm> using namespace std; #define ll long long int #define MAX_S 100001 ll n, m, maxv, res; ll lesson[MAX_S]; void func() { ll left = maxv, right = 1000000000; ll sum, cnt; while (left <= right) { ll mid = (left + right) / 2; sum = 0, cnt = 0; for (int i = 0; i < n; ++i) { if (sum + lesson[i] > mid) { cnt++; sum = 0; } sum += lesson[i]; } if (sum != 0) cnt++; if (cnt <= m) { right = mid - 1; res = min(res, mid); } else if (cnt > m) { left = mid + 1; } } } int main() { scanf("%lld %lld", &n, &m); for (int i = 0; i < n; ++i) { scanf("%lld", &lesson[i]); maxv = max(maxv, lesson[i]); } res = 9999999999999999; func(); printf("%lld\n", res); return 0; } | cs |
'문제풀기이야기' 카테고리의 다른 글
1654번_랜선 자르기_BOJ (0) | 2018.07.16 |
---|---|
6236번_용돈 관리_BOJ (0) | 2018.07.16 |
2805번_나무 자르기_BOJ (0) | 2018.07.15 |
1072번_게임_BOJ (0) | 2018.07.15 |
14502번_연구소_BOJ (0) | 2018.06.25 |