알고리즘 문제풀이/백준
[백준 2512] 예산
홍시홍
2020. 2. 19. 00:20
https://www.acmicpc.net/problem/2512
2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상 100,000 이하이다. 그 다음 줄에는 총 예산을 나타내는 정수 M이 주어진다. M은 N 이상 1,000,000,000 이하이다.
www.acmicpc.net
요구사항
1. 상한선 금액 구하기
풀이
1. 그대로 금액 배정 가능한지 확인
2. 안된다면 이분 탐색으로 상한액 책정
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n, m;
ll map[10001];
ll sum;
ll ans = 0;
void solve() {
ll low = 0;
ll high = m;
ll maxv = 0;
ll nowtemp = 0;
ll maxv1 = 0;
for (int i = 0; i < n; i++) {
nowtemp += map[i];
maxv1 = max(maxv1, map[i]);
}
if (nowtemp <= m) {
ans = maxv1;
return;
}
while (low <= high)
{
ll mid = (low + high) / 2;
ll temp = 0;
for (int i = 0; i < n; i++) {
if (map[i] < mid){
temp += map[i];
}
else {
temp += mid;
}
}
if (temp <= m) {
ans = max(mid, ans);
}
if (temp >= m) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> map[i];
}
cin >> m;
solve();
cout << ans << endl;
}