[BOJ 28357] 사탕 나눠주기
2023. 7. 22. 19:54ㆍBaekjoon/제 7회 천하제일 코딩대회 본선
728x90
https://www.acmicpc.net/problem/28357
- 문제 요약
소수전공 수업을 마무리한 찬우는 축하의 의미로 학생들에게 사탕을 나누어 주려 한다.
구체적으로, 기준이 되는 음이 아닌 정수 점을 넘는 학생들에게 점수가 높은 만큼 많은 사탕을 줄 것이다.
를 정한 뒤 최종 점수가즉, 점을 받은 학생은 개, 점을 받은 학생은 개, ( )점을 받은 학생은 개의 사탕을 받게 된다.
찬우는 학생들에게 최대한 많은 사탕을 나누어주고 싶기 때문에 기준 점수 를 가능한 한 낮게 정하려 한다.
하지만, 지금 가지고 있는 돈으로는 사탕을 개까지만 살 수 있기 때문에 사탕의 총 개수가 개를 넘으면 안 된다.
찬우의 수업은 총 명이 수강했고, i번째 학생은 점을 받았다.
수강생의 수와 각 학생의 점수, 사탕의 최대 개수 가 주어질 때 찬우를 위해 가능한 의 최솟값을 구하는 프로그램을 작성해 주자.
- 알고리즘 정리
X가 증가할수록 필요한 사탕의 개수는 줄어들거나 동일합니다.
그러므로 이분 탐색을 돌리며 가장 작은 X를 찾아주면 됩니다.
- 코드 작성
#include<bits/stdc++.h>
using namespace std;
#define MAX 500001
typedef long long ll;
ll n,k,arr[MAX],l,r=1e12;
bool f(ll x){
ll result=0;
for(int i=1;i<=n;i++){
result+=max(0LL,arr[i]-x);
}
return result<=k;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
while(l<r){
ll mid=(l+r)/2;
if(f(mid)){
r=mid;
}
else{
l=mid+1;
}
}
cout<<r;
}
728x90
'Baekjoon > 제 7회 천하제일 코딩대회 본선' 카테고리의 다른 글
[BOJ 28355] 무한 수열 (0) | 2023.07.29 |
---|---|
[BOJ 28360] 양동이 게임 (0) | 2023.07.23 |
[BOJ 28358] 생일 맞추기 (0) | 2023.07.22 |
[BOJ 28359] 수열의 가치 (0) | 2023.07.22 |
[BOJ 28356] 부정행위 멈춰! (0) | 2023.07.21 |