티스토리 뷰

반응형

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

 

2512번: 예산

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

www.acmicpc.net

  • 필요한 배경지식

이분탐색, 매개 변수 탐색 : parametric search

 

 

  • 문제 해결 방법

답으로 출력될 값(배정될 예산)을 기준으로 하여, 매개 변수 탐색을 하면 됩니다.

즉, 이분탐색으로 배정될 예산을 구하는 과정에서 그 예산이 배정될 수 있으면 예산을 늘리고 배정될 수 없다면 줄이면서 가장 큰 값을 찾아나가는 방법입니다.

이분탐색의 구현은 lower bound 방식을 활용하여 구현했습니다.

 

 

  • 비슷한 문제

백준 1654번 - 랜선 자르기 : https://www.acmicpc.net/problem/1654

백준 2805번 - 나무 자르기 : https://www.acmicpc.net/problem/2805

백준 2792번 - 보석 상자 : https://www.acmicpc.net/problem/2792

 

 

 

 

  • C++ 전체 코드
#include<bits/stdc++.h>
using namespace std;

int N,M;
int m[10001]{};

// 예산(mid)이 총 예산(M)안에 들어올 수 있는지 확인
bool isP(int mid){ 
    int sum = 0;
    for(int i=0; i<N; i++){
        if(m[i] <= mid) sum += m[i];
        else sum += mid;
    }
    if(sum <= M) return true;
    else return false;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>N;
    int l=0,r=0;
    for(int i=0; i<N; i++) {
        cin>>m[i];
        r = max(r, m[i]); // 탐색할 예산의 최댓값
    }
    cin>>M;

    while(l<=r){
    	// mid = 탐색할 예산의 값
        int mid = (l+r)/2;
        if(isP(mid)) l = mid + 1; // 예산이 충분하다면 늘리기
        else         r = mid - 1; // 예산이 충분하지 않다면 줄이기
    }
    cout<<r;
}

 

반응형

'알고리즘 공부 > 문제풀이' 카테고리의 다른 글

백준 10159번 - 저울  (0) 2021.05.23
백준 1368번 - 물대기  (0) 2021.05.22
백준 10775번 - 공항  (0) 2021.05.21
백준 16345번 - 인구 이동  (0) 2021.05.20
백준 14891번 - 톱니바퀴  (0) 2021.05.20
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함