Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- BFS
- 완전탐색
- 백준
- 구현
- 자바PS
- 백준코딩테스트
- 재귀함수
- spring
- 게더타운시작
- 01BFS
- GatherTown
- 다익스트라
- 취득후기
- 엘라스틱서치
- 이젠 골드구현도 어렵네..
- PS
- 네트워크플로우
- 시뮬레이션
- dp
- java
- COSPROJAVA1급
- COSPRO
- deque
- 알고리즘
- YBMCOS
- DFS
- 다이나믹프로그래밍
- 우선순위큐
- QUICKSTARTGUIDE
- 세그먼트트리
Archives
- Today
- Total
공부공간
BOJ - 2512 ) 예산 본문
N개의 지방에게 알맞는 예산을 분배하는 문제이다.
입력의 마지막에 돈이 주어지는데, 각자 원하는금액을 최대한 맞추어주면서,
내가가지고있는 금액 한도에서 분배해야한다.
즉, 요청값을 정렬한 후에 이분탐색으로 적절한 예산을 찾아주면된다.
두가지의 예외가 존재하는데,
1. 예산이 너무 많아서 모두 원하는만큼 주어도 되는경우
2. 예산이 너무 적어서 원하는금액중 가장 작은 금액으로도 못주는경우
만 이분탐색 전에 체크해주면된다.
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
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,Budget,mid,res;
vector < int > want;
void input(){
cin >> N;
for(int index = 1 ; index <= N ; index ++){
int t; cin>> t;
want.push_back(t);
}
cin >> Budget;
}
int main(int argc, char** argv) {
input();
sort(want.begin() , want.end());
if(want[N-1]*N <= Budget){
/// 예산이 너무 많은경우
cout<< want[N-1];
return 0;
}
else if(want[0]*N > Budget){
/// 예산이 너무 적은경우
cout << Budget/N;
return 0;
}
else{
int left = want[0] , right = want[N-1];
while(left <= right){
mid = (left + right) / 2 ;
int total =0;
for(int index =0 ; index < N ; index++){
if(want[index] >= mid){
total += mid;
}
else total += want[index];
}
if( total > Budget){
right = mid -1;
}
else {
res = max(res,mid);
left = mid +1;
}
}
}
cout << res;
return 0;
}
|
'알고리즘 > 이분탐색' 카테고리의 다른 글
BOJ - 8983 ) 사냥꾼 (0) | 2020.10.01 |
---|---|
BOJ - 2473 ) 세용액 (0) | 2020.08.28 |
BOJ - 2110 ) 공유기 설치 (0) | 2019.12.17 |
BOJ - 2805 ) 나무자르기 (0) | 2019.12.17 |
Comments