728x90
반응형
https://www.acmicpc.net/problem/16401
16401번: 과자 나눠주기
첫째 줄에 조카의 수 M (1 ≤ M ≤ 1,000,000), 과자의 수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 과자 N개의 길이 L1, L2, ..., LN이 공백으로 구분되어 주어진다. 과자의 길이는 (1 ≤ L1, L2, ..., LN ≤ 1,
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
long long m, n;
cin >> m >> n;
vector<long long> v;
for(int i = 0; i < n; i++){
int x;
cin >> x;
v.push_back(x);
}
sort(v.begin(), v.end());
long long min = 1;
long long max = v[n - 1];
long long ans = 0;
while(min <= max){
long long cnt = 0;
long long mid = (min + max) / 2;
for(int i = 0; i < n; i++){
cnt += v[i] / mid;
}
if(cnt >= m){
min = mid + 1;
ans = mid;
}else{
max = mid - 1;
}
}
cout << ans << endl;
return 0;
}
이분 탐색 문제이다. min은 과자의 길이가 가장 작은 경우인 1, max는 가장 긴 과자의 길이로 설정한다.
mid 길이로 나눠줄 때 몇 명(cnt)에게 나눠줄 수 있는지 구한다.
cnt가 m보다 크거나 같다면 과자 길이가 짧아서 다 나눠줄 수 있다는 의미이므로 min을 mid + 1로 이동시키고 ans를 mid로 설정한다.
cnt가 m보다 작다면 나눠주는 과자 길이가 길어서 다 나눠줄 수 없다는 의미이므로 max를 mid - 1로 이동시킨다.
728x90
반응형
'Algorithm > BAEKJOON' 카테고리의 다른 글
[BOJ] 17250번 은하철도 (C++) (0) | 2022.08.01 |
---|---|
[BOJ] 1863번 스카이라인 쉬운거 (C++) (0) | 2022.07.31 |
[BOJ] 4949번 균형잡힌 세상 (C++) (0) | 2022.07.29 |
[BOJ] 2805번 나무 자르기 (C++) (0) | 2022.07.29 |
[BOJ] 16173번 점프왕 쩰리 (Small) (C++) (0) | 2022.07.28 |