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
주의할 점
- 답이 0이 나올수도 있다.
- mid가 0인 경우 l이 0, r이 1인 경우도 포함된다.
- l과 r이 둘다 0인 경우를 처리하지 않으면 무한루프를 돌게 된다.
예제
3 3
1 1 1
1
3 2
1 1
0
1 1
1000000000
1000000000
코드
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
int M, N;
vector<int> snacks;
void input(){
int snack;
cin>>M>>N;
for(int i=0;i<N;++i){
cin>>snack;
snacks.push_back(snack);
}
}
void solution(){
sort(snacks.begin(), snacks.end(), greater<int>());
int l=0, r=1'000'000'000;
while(l<r){
int mid = (l+r)/2;
if(l == 0 && r == 0)
break;
if(mid == 0){
mid = 1;
}
int cnt = 0;
for(int i=0;i<N&&cnt<M;++i){
cnt += snacks[i]/mid;
}
if(cnt>=M)
l = mid + 1;
else
r = mid - 1;
}
cout<<r<<'\n';
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
solution();
return 0;
}

728x90
'알고리즘 > 백준 문제' 카테고리의 다른 글
| 14940 - 쉬운 최단거리 (0) | 2023.07.17 |
|---|---|
| 17609 - 회문 (0) | 2023.07.16 |
| 22682 - 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.07.15 |
| 17266 - 어두운 굴다리 (0) | 2023.07.15 |
| 2179 - 비슷한 단어 (0) | 2023.07.14 |
댓글