728x90
이분탐색으로 문제를 해결했습니다.
예산의 상한선을 지정해서 예산과 최대한 비슷하게 만드는 문제입니다.
1부터 N까지의 수를 전부 계산하면 시간초과가 발생하게 됩니다.
그래서 sort를 해준 다음 이분탐색을 통해서
반틈씩 이동하면서 가장 가까워지는 값을 찾아냈습니다.
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int n;
int result = 0;
ll sum = 0;
ll budget;
ll leftN, rightN;
ll arr[10001];
void binary_find(ll x)
{
ll temp = 0;
if (leftN > rightN) {
return;
}
for (int i = 0; i < n; ++i) {
if (arr[i] > x) {
temp += x;
}
else {
temp += arr[i];
}
if (budget < temp) {
rightN = x - 1;
binary_find((rightN + leftN) / 2);
return;
}
}
if (sum < temp) {
sum = temp;
result = x;
}
leftN = x + 1;
binary_find((rightN + leftN) / 2);
}
int main(int argc, char *argv[])
{
scanf("%lld", &n);
memset(arr, 0, sizeof(arr));
for (int i = 0; i < n; ++i) {
scanf("%lld", &arr[i]);
}
sort(arr, arr + n);
scanf("%lld", &budget);
leftN = 0;
rightN = arr[n - 1];
binary_find((leftN + rightN) / 2);
printf("%d\n", result);
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 1357번 뒤집힌 덧셈 (0) | 2019.10.24 |
---|---|
[C++] 백준 2805번 나무 자르기 (0) | 2019.10.15 |
[C++] 백준 17521번 Byte Coin (0) | 2019.10.14 |
[C++] 백준 17520번 Balanced String (0) | 2019.10.14 |
[C++] 백준 11378번 열혈강호 4 (0) | 2019.10.13 |