간단한 이분탐색 문제이다.
최대값을 right로 0을 left 로 설정한 후 calc 함수만 짠뒤 간단히 이분탐색을 돌리면 풀리는 간단한 문제이다.
다만 값의 범위가 int 값의 범위를 넘어가기 때문에 이를 long long 으로 변환해주어 적절하게 풀면 간단히 풀린다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <tuple>
#include <string>
#include <string.h>
#include <stack>
#include <set>
using namespace std;
typedef pair<int, int> pii;
typedef tuple<int, int, string> tii;
typedef long long LL;
LL n, m;
LL arr[1000001];
LL calc(LL x) {
LL res = 0;
for (int i = 0; i < n; i++) {
res += (arr[i] - x > 0) ? arr[i] - x : 0;
}
return res;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
LL right = 1000000000;
LL left= 0;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
LL mid;
LL ans = 0;
while (left <= right) {
mid = (left + right) / 2;
LL res = calc(mid);
if (res >= m) {
ans = max(ans, mid);
left = mid + 1;
}
else if(res < m){
right = mid - 1;
}
}
cout << ans;
return 0;
}
'책장 > 알고리즘' 카테고리의 다른 글
[백준-1082] 방번호 (0) | 2021.08.10 |
---|---|
[백준-15684] 사다리 조작 (0) | 2021.08.09 |
[백준-2517] 달리기 (0) | 2021.08.08 |
[백준-1202] 보석도둑 (0) | 2021.07.13 |