-
https://www.acmicpc.net/problem/2512
2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상
www.acmicpc.net
모든 예산을 배정할 수 있는 경우에만 예외처리해주면, 그 외에는 간단하다.
입력된 예산 요청액에 대해서, min(a[i], mid)를 누적해주고, 누적된 값이 총예산액을 초과하는지를 판별한다.
#include <bits/stdc++.h>using namespace std;#ifdef ONLINE_JUDGEconstexpr bool local = false;#elseconstexpr bool local = true;#endifusing ll = long long;using pi = pair<ll, ll>;int n, m, ans;vector<int> a;bool f(int mid) {int i, cur = 0;for (i = 0; i < n; i++) cur += min(a[i], mid);return cur <= m;}int main(void) {if (!local) ios_base::sync_with_stdio(0), cin.tie(0);cin >> n;a.resize(n);int i;for (i = 0; i < n; i++) cin >> a[i];cin >> m;if (accumulate(a.begin(), a.end(), 0) <= m) {cout << *max_element(a.begin(), a.end());return 0;}int s = 0, e = (int)(1e9 + 0.5);while (s <= e) {int mid = s + e >> 1;bool ret = f(mid);if (ret == true) {ans = max(mid, ans);s = mid + 1;} elsee = mid - 1;}cout << ans;return 0;}
'BOJ' 카테고리의 다른 글
[15810] 풍선 공장 (0) 2022.03.04 [6236] 용돈 관리 (0) 2022.03.02 [4195] 친구 네트워크 (0) 2022.03.02 [1976] 여행 가자 (0) 2022.03.02 [2696] 중앙값 구하기 (0) 2022.02.27