https://www.acmicpc.net/problem/2343
2343번: 기타 레슨
강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경
www.acmicpc.net
[난이도] Silver1
[유형] 이분탐색
[풀이]
가능한 블루레이 크기의 최솟값은 길이가 가장 짧은 강의의 길이
이고 최댓값은 100000(N의 최댓값) * 10000 (강의 길이의 최댓값) = 10^9
입니다.
범위가 너무 크기 때문에 이분탐색을 이용해서 최솟값을 찾아주면 됩니다.
mid 값을 블루레이의 크기라고 가정 했을 때, bool check(int k) 함수를 이용해서 조건을 만족하는지 체크해주며
범위를 좁혀갈 수 있습니다.
#include <cstdio> int n,m,a[100000]; bool check(int k){ int cnt=1,sum=0; for(int i=0;i<n;i++){ if(sum+a[i]>k) { sum=0; cnt++; } sum+=a[i]; } return cnt <= m; } int main(){ scanf("%d%d",&n,&m); int lo=1,hi=1e9+1; for(int i=0;i<n;i++) { scanf("%d",&a[i]); if(a[i]>lo) lo=a[i]; } lo--; while(lo+1<hi){ int mid=(lo+hi)/2; if(check(mid)) hi=mid; else lo=mid; } printf("%d",lo+1); }
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Silver1/2343.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Silver2] 5397 : 키로거 (C++) (0) | 2022.11.06 |
---|---|
[BOJ/백준][Silver1] 15903 : 카드 합체 놀이 (C++) (0) | 2022.11.06 |
[BOJ/백준][Gold5] 2866 : 문자열 잘라내기 (C++) (0) | 2022.09.26 |
[BOJ/백준][Silver1] 1850 : 최대공약수 (C++) (0) | 2022.09.26 |
[BOJ/백준][Silver1] 2504 : 괄호의 값 (C++) (0) | 2022.09.26 |