말랑한 하루
[BAEKJOON] 16401 과자 나눠주기 (C++) 본문
반응형
[ 문제 ]
[ 조건 ]
최대한 긴 과자를 나눠줘야 될 것!
나눈 과자를 합칠순 없음 = 막대과자 1개는 1번사용하면 끝임.
[ 순서 ]
구해야 할 결과값이 "막대과자의 길이"이므로 막대과자 길이에 대해 이분탐색을 진행함
막대과자의 길이가, 모든 막대과자와 비교했을때 조각으로 나눠지는 경우를 전부 더해주어
이 값이 아이들의 수와 맞는지 비교하면됨.
[ 핵심소스코드 / C++ ]
// 이분탐색
while (left <= right) {
int mid = (left + right) / 2;
if (result) { // 결과값이 작다면
right = mid - 1;
}
else { // 크거나 같다면
res = res > mid ? res : mid; // 최대치 저장
left = mid + 1;
}
}
[ 전체소스코드 / C++ ]
#include <iostream>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
#define MAX 1000001
int child, s;
int snak[MAX];
int res;
int give(int mid) {
int result = 0;
for (int i = 0; i < s; i++)
result += snak[i] / mid;
return result < child;
}
void solve() {
int left = 1, right = snak[s - 1];
while (left <= right) {
int mid = (left + right) / 2;
if (give(mid)) {
right = mid - 1;
}
else {
res = res > mid ? res : mid;
left = mid + 1;
}
}
cout << res;
}
int main() {
#ifdef _CONSOLE
freopen("input.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> child >> s;
for (int i = 0; i < s; i++)
cin >> snak[i];
sort(snak, snak + s);
solve();
}
반응형
'문제풀이 > BAEKJOON Online Judge' 카테고리의 다른 글
[BAEKJOON] 1789 수들의 합 (C++) (0) | 2020.12.17 |
---|---|
[BAEKJOON] 1477 휴계소 세우기 (C++, Java) (0) | 2020.12.16 |
[BAEKJOON] 1302 베스트 셀러 (C++) (0) | 2020.12.14 |
[BAEKJOON] 16928 뱀과 사다리 게임 (C++, Java) (0) | 2020.12.10 |
[BAEKJOON] 9663 N-Queen (C++) (0) | 2020.02.05 |
Comments