문제 링크 : https://www.acmicpc.net/problem/2343
2343번: 기타 레슨
강토는 자신의 기타 레슨 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 레슨이 들어가는데, 블루레이를 녹화할 때, 레슨의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경우에는 레슨의 흐름이 끊겨, 학생들이 대혼란에 빠질 수 있기 때문이다. 즉, i번 레슨과 j번 레슨을 같은 블루레이에 녹화하려면 i와 j 사이의 모든 레슨도 같은 블루레이에 녹화해야 한다. 강토는 이 블루레이가 얼마나 팔릴지 아직 알 수 없기 때문에, 블루레이의 개수를 가
www.acmicpc.net
문제 설명
레슨의 수 와 블루레이의 수가 주어지고 그다음줄에 레슨의 길이가주어짐
레슨을 블루레이에 나눠서 녹음할껀데
1. 순서가 바뀌면 안되고
2. 블루레이의 길이를 최소로 해야됨
3. 최소 블루레이 길이 출력
알고리즘
이분 탐색 알고리즘으로 최소 블루레이 길이를 구하면 된다.
low는 레슨길이중 최대값으로 지정 ( 레슨길이보다 low 가 작을 경우 레슨이 아예 녹음 되지 않음 )
hi는 INF로 지정 밑에는 간단히 예시
1. low = 9 , hi = 20 -> mid =14
(1,2,3,4)(5,6)(7)(8)(9) - > 블루레이 개수 = 5 -> low를 mid+1 로
2. low = 15 ,hi = 20 ->mid = 17
(1,2,3,4,5)(6,7)(8,9) -> 블루레이 개수 :3 -> high를 mid-1로
3. low = 15,hi = 16 -> mid =15
(1,2,3,4,5)(6,7)(8)(9) -> 블루레이 개수 :4 -> low 를 mid+1 로
4. low = 16, hi =16 -> mid = 16
(1,2,3,4,5)(6,7)(8)(9) -> 블루레이 개수 : 4-> low를 mid+1로
5. low=17 , hi=16 -> low > hi 이므로 while 문 종료후 low 출력 .
코드
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 | #include<iostream> #include<vector> #include<algorithm> #include<string.h> using namespace std; typedef long long ll; int main() { cin.tie(NULL); ios::sync_with_stdio(false); int N, M; cin >> N >> M; vector<ll> blue(N); ll hi = 1000000; ll lo = 0; for (int i = 0; i < N; i++) { cin >> blue[i]; lo = max(lo, blue[i]); } while (lo <= hi) { //필요 블루레이의 갯수 int cnt = 1; ll mid = (lo + hi) / 2; ll sum = blue[0]; //최소 필요 블루레이의 갯수를 구하는 과정 for (int i = 1; i < N; i++) { if (sum + blue[i] > mid) { cnt++; sum = 0; } sum += blue[i]; } if (cnt <= M)hi = mid - 1; else lo = mid + 1; } cout << lo; } | cs |
참고 블로그 :https://alswnsdl.tistory.com/7
while문에서 계속 값이 1 씩 어긋나서 결국 다른사람의코드를 참고 하였다.
'c++ > 백준' 카테고리의 다른 글
백준 1780번 : 종이의 개수 (0) | 2020.04.14 |
---|---|
백준 2805번: 나무 자르기 (0) | 2020.04.14 |
백준 13904번 : 과제 (0) | 2020.04.13 |
백준 1629번 : 곱셈 (0) | 2020.04.13 |
백준 1074번 : Z (0) | 2020.04.13 |