티스토리 뷰

백준/실버

[백준 16401번] 과자 나눠주기 (C++)

게임개발기원 2023. 2. 13. 22:21

문제링크 : 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 <bits/stdc++.h> 
using namespace std;
#define fastio ios_base::sync_with_stdio(0); cin.tie(0);

int M, N, L, result;
vector <int> v;

void binary_search(int l, int h)
{
	while (l <= h)
	{
		int mid = (l + h) / 2;
		int cnt = 0;
		for (int i = 0; i < N; i++)
		{
			cnt += v[i] / mid;      //각각의 값을 현재 mid로 나눠줌
		}
		if (cnt >= M)               
		{
			result = mid;
			l = mid + 1;
		}
		else
		{
			h = mid - 1;
		}
	}
}

int main()
{

	fastio;
	cin >> M >> N;

	for (int i = 0; i < N; i++)
	{
		cin >> L;
		v.push_back(L);
	}

	sort(v.begin(), v.end());
	binary_search(1, v.back());
	cout << result;

	return 0;
}

 

각 과자의 길이를 현재 mid 값으로 나눠준다.

이렇게 나눠준 값의 총합이 총 나눠줄 수 있는 사람의 갯수가 된다.

따라서 그 총합이 현재 나눠줄 사람의 수인 M보다 크거나 같다면 조건을 만족하게 되는 것이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함