문제링크 : https://www.acmicpc.net/problem/2512
2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
int arr[10001];
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int N;
cin >> N;
for(int i=0; i<N; i++)
{
cin >> arr[i];
}
int M;
cin >> M;
sort(arr, arr+N);
int l = 0, r = arr[N-1];
int sum, result = 0;
while(l<=r)
{
sum = 0;
int mid = (l+r)/2; //상한액
for(int i=0; i<N; i++)
{
sum += min(arr[i], mid);
}
if(M>=sum)
{
result = mid;
l = mid + 1;
}
else
{
r = mid - 1;
}
}
cout << result;
return 0;
}
이분탐색을 이용하여 푸는 문제다.
상한액을 mid 값으로 설정하고, 기존 배열과 비교하여 둘 중 작은 값을 더해나간다.
이렇게 더해나간 값이 총 예산 값인 M보다 작거나 같다면 해당 mid 값은 정답의 기준에 맞는 것이므로 result에 저장한다.
하지만 더 나은 정답이 있을 수 있으므로 탐색은 계속하여 최적의 mid 값을 찾는다.
'백준 > 실버' 카테고리의 다른 글
[백준 10025번] 게으른 백곰 (C++) (0) | 2023.04.08 |
---|---|
[백준 21736번] 헌내기는 친구가 필요해 (C++) (0) | 2023.04.07 |
[백준 22351번] 수학은 체육과목 입니다 3 (C++) (0) | 2023.04.05 |
[백준 17419번] 비트가 넘쳐흘러 (C++) (0) | 2023.04.04 |
[백준 2910번] 빈도 정렬 (C++) (0) | 2023.04.02 |