반응형
#include<iostream>
using namespace std;
int values[10001];
int search(int n,int m, int standard){
int result = 0;
for(int i=0; i<n; i++){
if(values[i] <= standard){
result += values[i];
}else{
result += standard;
}
}
if(result <= m){
return 1;
}else{
return 0;
}
}
int binarysearch(int max, int n, int m){
int low = 0, high = max;
int standard = 0;
int result = 0;
while(low <= high){
//cout << low << " " << high << endl;
standard = (high+low)/2;
if(search(n,m,standard) == 1){
result = standard;
low = standard+1;
}else{
high = standard-1;
}
}
return result;
}
int main(){
int n, m;
int max = 0;
cin >> n;
int sum = 0;
for(int i=0; i<n; i++){
cin >> values[i];
if(values[i] > max){ max = values[i]; }
sum += values[i];
}
cin >> m;
if(sum <= m){
cout << max;
}else{
cout << binarysearch(max, n, m);
}
}
설명
이분 탐색을 이용해서 푸는 문제이다. 예산요청액 중 가장 큰 값(high)과 0(low)의 중간값을 상한액으로 잡고 상한액을 다 더했을 때(상한액보다 예산요척액이 적을 경우 예상요청액을 더한다), 총 예산보다 적으면 low를 중간값으로 바꿔주고 다시 이분탐색을 진행하는 식으로 하면 된다.
문제점
만약 127과 128이 low와 high일경우 중간값이 계속 127로 걸려서 무한루프가 생기기도 했다. 이는 low는 중간값+1 high는 중간값-1로 해결해주었다.
반응형
'코딩 이야기 > 백준 풀이' 카테고리의 다른 글
백준 1476번: 날짜 계산 C++코드(브루트포스, Bruteforce) (0) | 2021.12.21 |
---|---|
백준 10819번: 차이를 최대로 C++ 코드(브루트포스, Bruteforce) (0) | 2021.11.19 |
백준 1987번: 알파벳 C++코드(DFS, Backtracking, 백트래킹) (0) | 2021.08.18 |
백준 16953번: A -> B C++ 코드(BFS) (0) | 2021.08.18 |
백준 1926번: 그림 C++코드(BFS) (0) | 2021.08.05 |