티스토리 뷰

1. 문제 링크

https://www.acmicpc.net/problem/2792

 

2792번: 보석 상자

문제 보석 공장에서 보석 상자를 유치원에 기증했다. 각각의 보석은 M가지 서로 다른 색상 중 한 색상이다. 원장 선생님은 모든 보석을 N명의 학생들에게 나누어 주려고 한다. 이때, 보석을 받지 못하는 학생이 있어도 된다. 하지만, 학생은 항상 같은 색상의 보석만 가져간다. 한 아이가 너무 많은 보석을 가져가게 되면, 다른 아이들이 질투를 한다. 원장 선생님은 이런 질투심을 수치화하는데 성공했는데, 질투심은 가장 많은 보석을 가져간 학생이 가지고 있는 보석

www.acmicpc.net

2. 문제 개요

모든 보석을 N명의 학생들에게 나누어 주려고 한다. 가장 많이 가져간 아이의 보석의 수가 질투심이라고 할 때, 질투심을 최소하 하라.

 

3. 문제 힌트

 말이 질투심이니 뭐니 해서 그렇지 결국 아이들이 조건을 만족하면서 질투심을 가장 작게 만드는 방법을 찾는것이다.

질투심을 X라고 가정하고 조건을 만족하는지 체크하고 이분 탐색하기.

 

4. 문제 풀이

조건을 만족하면 값을 저장하고 최솟값을 찾아야 하므로 right를 mid-1로 조정한다.

조건을 만족하지 못하면 질투심을 높여야 하므로 left를 mid+1 한다.

 

5. 코드

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

vector<int> v;

int main()
{
	int n, m;
	scanf("%d %d", &n, &m);
	v.resize(m);
	for (int i = 0; i < m; ++i)
		scanf("%d", &v[i]);

	int left = 1, right = 1e9;
	int ans = 0;
	while (left <= right)
	{
		int mid = (left + right) / 2;

		//check
		int len = v.size();
		long long int sum = 0;

		for (int i = 0; i < len; ++i)
		{
			sum += (long long int)ceil((double)v[i] / (double)mid);
		}
		if (sum <= n)
		{
			right = mid - 1;
			ans = mid;
		}
		else
		{
			left = mid + 1;
		}
	}
	printf("%d", ans);

	return 0;
}

6. 결과 사진

 

 

지적, 댓글 언제나 환영입니다~

댓글
«   2024/05   »
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
Total
Today
Yesterday