본문 바로가기

Coding Test

백준 2512 예산

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

 

2512번: 예산

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

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;



int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, m;
    int ans;

    cin >> n;

    vector<int> cost;

    for (int i = 0; i < n; i++) {
        int temp;
        cin >> temp;

        cost.push_back(temp);
    }

    cin >> m;

    sort(cost.begin(), cost.end());



    int s = 0;
    int e = cost[n - 1];
    int sum;


    while (s <= e) {
        sum=0;
        int mid = (s + e) / 2;

        for (int i = 0; i < n; i++) {
            sum += min(cost[i], mid);
        }
        if (m >= sum) {
            ans = mid;
            s = mid + 1;
        } else {
            e = mid - 1;
        }

    }

    cout << ans;

    return 0;
}

 

예산의 한도는 0원부터 각 지방 중 예산의 최댓값 중 찾을 수 있다.

예산을 정렬하고, 중간값을 예산의 한도로 정한 뒤, 그 때의 합을 구한다.

총 예산이 한도를 넘어가지 않으면 s=mid+1하여 예산의 한도를 높여보고, 

한도를 넘어간다면 e=mid-1하여 예산의 한도를 줄인다.

'Coding Test' 카테고리의 다른 글

백준 2346 풍선 터뜨리기  (0) 2024.04.04
백준 16937 두 스티커  (2) 2024.04.03
백준 15657 N과 M(8)  (2) 2024.04.01
백준 2467 용액  (1) 2024.04.01
백준 5639 이진 검색 트리  (2) 2024.03.31