본문 바로가기
Algorithm/📖Baekjoon

#2512 예산

by yewoneeee 2022. 6. 19.

# 문제

# 입력 및 출력

# 풀이

원래는 이분탐색 문제다

근데 나는 좀 다르게 풀었다

예산 요청을 하나씩 배당해주면서 최대 상한값을 찾도록 했다

#include <iostream>
#include <queue>
using namespace std;
priority_queue<int, vector<int>, greater<int>> pq;

int main() {
	int n, t, budget, sum = 0, maxv = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> t;
		pq.push(t);
		sum += t;
		maxv = maxv < t ? t : maxv;
	}
	cin >> budget;
	if (sum > budget) {
		maxv = 0;
		for (int i = n; i > 0; i--) {
			int ul = budget / i;
			maxv = ul > maxv ? ul : maxv;
			budget -= pq.top();
			pq.pop();
		}
	}
	cout << maxv;
}

정렬을 사용하기 귀찮아서 그냥 우선순위 큐를 하나 만들었음

어떤 예산 요청도 배정해주지 않았을때 ~ 마지막에서 두번째 요청까지 배정해주었을 때까지 반복해서 최대 상한값을 찾음

어떤 예산 요청도 배정해주지 않았을땐 예산을 n개로 나눠가지는 것이 상한값이 될 것이고

첫번째 예산 요청을 배정해주면 예산에서 첫번째 예산 요청 금액을 빼고 n-1개로 나눠가지는 것이 상한값이 될 것이다

이것을 마지막에서 두번째요청까지 배정해주었을때까지 보고 그 중에서 최대 상한값을 찾음

 

말로 설명하려니까 좀 이상한것같네ㅋㅋ

 

정석풀이는 이분 탐색이니까 이분탐색으로도 풀어봤다

#include <iostream>
#include <algorithm>
using namespace std;
int req[10000];
int n, m, result, sum;

int cal(int mid) {
	int sum = 0;
	for (int i = 0; i < n; i++) {
		if (mid < req[i]) sum += mid;
		else sum += req[i];
	}
	return sum;
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> req[i];
		sum += req[i];
	}
	sort(req, req + n);
	cin >> m;
	if (sum > m) {
		int start = 1;
		int end = req[n - 1];
		int mid;
		while (start <= end) {
			mid = (start + end) / 2;
			int s = cal(mid);
			if (s <= m) {
				result = mid;
				start = mid + 1;
			}
			else end = mid - 1;
		}
		cout << result;
		return 0;
	}
	else cout << req[n - 1];
}

1부터 요청 금액중 가장 큰 금액까지를 범위로 두고 범위를 절반씩 줄여나가면서 상한값을 찾는 방식이다

 

둘 다 잘 돌아가긴 하는데 이분탐색으로 푸는게 더 명확한 풀이같다

첫번째 방법은 약간 야매같음ㅋㅋ

'Algorithm > 📖Baekjoon' 카테고리의 다른 글

#1074 Z  (0) 2022.06.22
#1080 행렬  (0) 2022.06.21
#7576 토마토  (0) 2022.06.18
#10994 별 찍기 - 19  (0) 2022.06.17
#1769 3의 배수  (0) 2022.06.16

댓글