코딩테스트/백준_실버 [C++][백준 2512] 예산 - [문제] https://www.acmicpc.net/problem/2512 2512번: 예산 첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상 www.acmicpc.net [문제 풀이] 이분 탐색을 이용해서 푸는 문제이다. 지방 예산의 최댓값에서 부터 0까지의 범위에서 얼마를 써야 최대로 쓸 수 있는지 파악하자. 지방 예산의 최댓값을 파악하면서 동시에 지방 예산의 최댓값을 모두 합쳤을때보다 예산이 높다면 최댓값을 반환시켜주자. (18~27) 이분 탐색을 이용하자.(33~53) 이분 탐색 도중 예산값을 얼만큼 가져갈 수 있는지 파악하자.(37~44) [코드] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 #include<iostream> #define endl "\n" using namespace std; int budget[10001]; void solve(int n,int m){ int high = 10000; int low = 0; int mid = 0; int answer = 0; long long total = 0; int Max = 0; for(int i = 0;i<n;i++){ total += budget[i]; if(Max<budget[i]){ Max = budget[i]; } } if(total<m){ cout<<Max<<endl; return; } mid = (high + low) / 2; high = Max; while(low<=high){ total = 0; mid = (high + low) / 2; for(int i = 0;i<n;i++){ if(budget[i]<mid){ total += budget[i]; } else{ total += mid; } } if(total>m){ high = mid -1; } else if(total<=m){ answer = mid; low = mid + 1; } } cout<<answer<<endl; return; } int main(){ int n,m; cin>>n; for(int i = 0;i<n;i++){ cin>>budget[i]; } cin>>m; solve(n,m); return 0; } Colored by Color Scripter cs 공유하기 게시글 관리 Yoon-1212 '코딩테스트 > 백준_실버' 카테고리의 다른 글 [C++][백준 10816] 숫자 카드 2 (0) 2022.09.07 [C++][백준 11053] 가장 긴 증가하는 부분 수열 (0) 2022.09.07 [C++][백준 1072] 게임 (0) 2022.09.07 [C++][백준 1913] 달팽이 (0) 2022.09.06 [C++][백준 15658] 연산자 끼워넣기 (2) (0) 2022.09.03 Contents 당신이 좋아할만한 콘텐츠 [C++][백준 10816] 숫자 카드 2 2022.09.07 [C++][백준 11053] 가장 긴 증가하는 부분 수열 2022.09.07 [C++][백준 1072] 게임 2022.09.07 [C++][백준 1913] 달팽이 2022.09.06 댓글 0 + 이전 댓글 더보기