문제 (https://www.acmicpc.net/problem/2343)
2343번: 기타 레슨
강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경
www.acmicpc.net
실수했던 점!
- ans 초기화할 때 값은 10,000이 아닌 1,000,000,000으로 해야 함
- 블루레이의 개수가 꼭 M일 필요 없음
- cnt 초기화를 1로 해두면 편하다... 많이....
- M <= N이므로 mid 값보다 긴 강의가 있을 땐 cnt = n + 1로 설정하고 break 한다 => 모든 강의가 들어가지 않는 것이므로 mid 값이 커지도록 한다
[소스코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
BOJ 2343번: 기타 레슨 | |
2021-12-19 | |
Binary Search | |
*/ | |
#include <iostream> | |
using namespace std; | |
int main() { | |
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); | |
int n, m, num, ans = 1000000000; | |
int start, end, mid, sum, cnt; | |
cin >> n >> m; | |
int arr[n]; | |
for(int i = 0 ; i < n ; i++) { | |
cin >> arr[i]; | |
sum += arr[i]; | |
} | |
start = 1; | |
end = sum; | |
while(start <= end) { | |
cnt = 1; | |
sum = 0; | |
mid = (start + end) / 2; | |
for(int i = 0 ; i < n ; i++) { | |
if(arr[i] > mid) { // 모든 강의가 들어가야 함 | |
cnt = n + 1; // M <= N (cnt는 무조건 M보다 크게 됨) | |
break; | |
} | |
sum += arr[i]; | |
if(sum > mid){ | |
cnt++; | |
sum = arr[i]; | |
} | |
} | |
if(cnt <= m) { | |
ans = min(ans, mid); | |
end = mid - 1; | |
} | |
else { | |
start = mid + 1; | |
} | |
} | |
cout << ans; | |
return 0; | |
} |

'ALGORITHM > BOJ' 카테고리의 다른 글
[BOJ] 1477번 휴게소 세우기 (C++) (0) | 2021.12.21 |
---|---|
[BOJ] 2776번 암기왕 (C++) (0) | 2021.12.20 |
[BOJ] 10816번 숫자 카드 2 (C++) (0) | 2021.12.19 |
[BOJ] 1654번 랜선 자르기 (C++) (0) | 2021.12.19 |
[BOJ] 2805번 나무 자르기 (C++) (0) | 2021.12.19 |