문제 설명
N명의 학생들의 점수와 사탕의 최대 개수 가 주어졌을 때, 사탕의 총 개수가 를 넘지 않도록 하면서 기준 점수 를 가능한 한 낮게 설정하는 문제이다.
간단한 이분탐색 응용(파라미터 서치) 문제이다. 적절한 X를 이분탐색을 통해 찾으면 된다.
- 의 범위를 설정한다. 의 최솟값은 0, 최댓값은 10^12 이다.
- 이분 탐색을 통해 중간값 를 선택한다.
- 선택된 X에 대해 각 학생에게 나누어 줄 사탕의 총 개수를 계산한다.
- 사탕의 총 개수가 를 초과하지 않으면 high = mid - 1, 초과하면 low = mid + 1.
- 최종적으로 X의 최솟값을 찾는다.
소스 코드
#include <stdio.h>
#include <vector>
#include <algorithm>
int n;
long long k;
long long arr[500010];
long long satang(long long x)
{
int i;
long long res = 0;
for(i=0;i<n;i++) {
if(arr[i] > x) res += arr[i] - x;
}
return res;
}
int main()
{
int i;
scanf("%d %lld", &n, &k);
for(i=0;i<n;i++) scanf("%lld", &arr[i]);
long long low = 0, high = 1000000000000;
while(low <= high) {
long long mid = (low + high)/2;
long long mid_res = satang(mid);
if(mid_res <= k) high = mid - 1;
else low = mid + 1;
}
printf("%lld", high + 1);
return 0;
}
'PS(알고리즘 문제풀이) 관련 글 > 백준(Baekjoon)풀이' 카테고리의 다른 글
백준 14677: 병약한 윤호 (0) | 2024.08.13 |
---|---|
백준 17299 : 오등큰수 (0) | 2024.08.13 |
백준 3015 : 오아시스 재결합 (1) | 2024.08.13 |
백준 17298 : 오큰수 (0) | 2024.08.13 |
백준 27986 : 평범한 구성적 문제 (0) | 2024.08.12 |