Computer Science/Algorithm Problem

백준] 2512 - 예산(KOI 2012;한국정보올림피아드 2012)

TwinParadox 2018. 6. 12. 22:29
728x90

시간 제한 : 1초

메모리 제한 : 128MB




입력

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상 100,000 이하이다. 그 다음 줄에는 총 예산을 나타내는 정수 M이 주어진다. M은 N 이상 1,000,000,000 이하이다. 




출력

첫째 줄에는 배정된 예산들 중 최대값인 정수를 출력한다.




소스코드

#include <iostream>
using namespace std;
int main(void)
{
	int arr[10001], max = 0, n, limit;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
		if (arr[i] > max)
			max = arr[i];
	}
	cin >> limit;
	int start = 0, end = max, mid;
	while (start <= end)
	{
		mid = (start + end) / 2;
		int sum = 0;
		for (int i = 0; i < n; i++)
		{
			if (arr[i] > mid)
				sum += mid;
			else
				sum += arr[i];
		}

		if (sum > limit)
			end = mid - 1;
		else
			start = mid + 1;
	}
	cout << end;
}




Tip

이분 탐색으로 접근하면 된다. 요구 예산의 최대치, 예산 배정액을 0으로 시작해서 이분 탐색을 실시하면 된다.



728x90