※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2512번 문제인 예산이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2512
2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상
www.acmicpc.net
요청하고 있는 예산이 가장 많은 예산요청들서부터 예산을 차근차근 깎아나가는 greedy한 전략으로 O(N) 시간 안에 문제를 해결할 수 있다.
이 문제를 greedy한 전략으로 문제를 해결할 경우, 초기 예산요청 그대로 예산을 할당할 수 있는 경우를 따로 처리해주는 것이 좋다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll arr[10000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll mx = 0;
ll total = 0;
int N; cin >> N;
for (int i = 0; i < N; i++) {
ll x; cin >> x;
total += x;
arr[i] = x;
mx = max(mx, x);
}
sort(arr, arr + N);
ll M; cin >> M;
if (total <= M) cout << mx;
else {
int i = N - 1;
ll cnt = 0;
for (; i > 0; i--) {
cnt++;
ll dist = arr[i] - arr[i - 1];
total -= cnt * dist;
if (total <= M) {
cout << arr[i - 1] + (M - total) / cnt;
break;
}
}
if (i == 0) cout << M / N;
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2343 // C++] 기타 레슨 (0) | 2021.11.06 |
---|---|
[BOJ 3020 // C++] 개똥벌레 (0) | 2021.11.05 |
[BOJ 3896 // C++] 소수 사이 수열 (0) | 2021.11.03 |
[BOJ 1477 // C++] 휴게소 세우기 (0) | 2021.11.02 |
[BOJ 2110 // C++] 공유기 설치 (0) | 2021.11.01 |