2343번: 기타 레슨
강토는 자신의 기타 레슨 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 레슨이 들어가는데, 블루레이를 녹화할 때, 레슨의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경
www.acmicpc.net
처음엔 정렬되지 않은 벡터를 이분탐색을 어떻게 진행하지 고민했었던 문제이다. 예전에 L사 코테를 봤을 때 나왔던 문제랑 매우 유사해서 꼭 풀어보고 싶었다!
다소 좀 생소한 이분 탐색 유형인 것 같아 고민을 좀 했었는데 반례 모음을 보고 풀 수 있었다.
이분 탐색을 진행할때 left와 right의 초기 값에도 신경을 써야된다는 것을 알 수 있었다.
참고한 반례모음: bingorithm.tistory.com/10
"백준 2343번-기타 레슨" 반례 모음
www.acmicpc.net/problem/2343 2343번: 기타 레슨 강토는 자신의 기타 레슨 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 레슨이 들어가는데, 블루레이를 녹화할 때, 레슨의 순서
bingorithm.tistory.com
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int n, m;
long long sum[100001];
int main() {
int x;
vector<int> v;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> x;
v.push_back(x);
}
int left = *max_element(v.begin(), v.end());
int right = 10000 * n;
while (left <= right) {
int c = 1;
int mid = (left + right) / 2;
for (int i = 0; i < v.size(); i++) {
sum[c] += v[i];
if (sum[c] > mid) {
sum[c] -= v[i];
c++;
sum[c] += v[i];
}
}
if (c > m) {
left = mid + 1;
}
else {
right = mid - 1;
}
for (int i = 1; i <= m; i++) {
sum[i] = 0;
}
}
cout << left;
return 0;
}
'알고리즘 공부 > C++' 카테고리의 다른 글
[C++] 백준 1992번: 쿼드트리 (0) | 2020.11.30 |
---|---|
[C++] 백준 2583번: 영역 구하기 (0) | 2020.11.30 |
[C++] 백준 2665번: 미로 만들기 (0) | 2020.11.28 |
[C++] 백준 2206번: 벽 부수고 이동하기 (0) | 2020.11.28 |
[C++] 백준 9663번: N-Queen (0) | 2020.11.27 |