※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2512번 문제인 예산이다.
문제는 아래 링크를 확인하자.

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

 

2512번: 예산

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

www.acmicpc.net

요청하고 있는 예산이 가장 많은 예산요청들서부터 예산을 차근차근 깎아나가는 greedy한 전략으로 O(N) 시간 안에 문제를 해결할 수 있다.

 

이 문제를 greedy한 전략으로 문제를 해결할 경우, 초기 예산요청 그대로 예산을 할당할 수 있는 경우를 따로 처리해주는 것이 좋다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

ll arr[10000];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	ll mx = 0;
	ll total = 0;
	int N; cin >> N;
	for (int i = 0; i < N; i++) {
		ll x; cin >> x;
		total += x;
		arr[i] = x;
		mx = max(mx, x);
	}

	sort(arr, arr + N);
	ll M; cin >> M;
	
	if (total <= M) cout << mx;
	else {
		int i = N - 1;
		ll cnt = 0;
		for (; i > 0; i--) {
			cnt++;
			ll dist = arr[i] - arr[i - 1];
			total -= cnt * dist;
			if (total <= M) {
				cout << arr[i - 1] + (M - total) / cnt;
				break;
			}
		}
		if (i == 0) cout << M / N;
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2343 // C++] 기타 레슨  (0) 2021.11.06
[BOJ 3020 // C++] 개똥벌레  (0) 2021.11.05
[BOJ 3896 // C++] 소수 사이 수열  (0) 2021.11.03
[BOJ 1477 // C++] 휴게소 세우기  (0) 2021.11.02
[BOJ 2110 // C++] 공유기 설치  (0) 2021.11.01

+ Recent posts