์ค๋ฒ3 : ์ด์ง ํ์ ๋ฌธ์ ์ด๋ค.
ํ์ด
์์ฐ ๊ธ์ก์ ์ต๋์์ฐ๊ณผ ์์ ์์ฃผ๋(0์) ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฐ๋ผ์ 0๊ณผ max๊ธ์ก์ ์ ๋์ผ๋ก ์ก๋๋ค.
:-: | :-: | :-: | :-: | :-: |
---|---|---|---|---|
left | right | mid | ์์ฐ์๋ชจ๊ธ์ก | ํ๋ณด๊ฐ๋ฅ์ฌ๋ถ |
0 | 150 | 75 | 300 | O |
75 | 150 | 112 | 446 | O |
113 | 150 | 131 | 492 | X |
113 | 130 | 121 | 472 | O |
122 | 130 | 126 | 482 | O |
126 | 129 | 127 | 484 | O |
128 | 129 | 128 | 486 | X |
mid๊ฐ m๋ณด๋ค ์์ผ๋ฉด ๋ต์ ํ๋ณด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. ํ์์ ํ๋, ๋ต์ธ ์ํฉ๋ง ์ ๊ฐ์ ธ์ค๋ฉด ๋จ.
Code
//
// main.cpp
// algorithm_prac
//
// Created by ์ต์์ on 2021/04/05.
//
#include <iostream>
#include <algorithm>
typedef long long ll;
using namespace std;
int req[10001];
bool comp(int a, int b){
return a<b;
}
int main(){
int n, total = 0;
ll m = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> req[i];
total += req[i];
}
cin >> m;
sort(req, req+n, comp);
if (total < m) {
cout << req[n-1] << '\n';
return 0;
}
int left = 0, right = req[n-1];
int ans = 0;
while (left <= right) {
int mid = (left+right)/2;
ll sum = 0;
for (int i = 0; i < n; i++) {
if (mid < req[i]) sum += mid;
else sum += req[i];
}
if (sum > m) {
right = mid-1;
} else {
ans = mid;
left = mid+1;
}
}
cout << ans << '\n';
return 0;
}