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 |