https://www.acmicpc.net/status?group_id=6459
채점 현황
www.acmicpc.net
이분탐색을 이용한 문제였다. 적어도 n만큼의 나무를 잘라서 가져가야 된다. 우선 0부터 가장 긴 나무의 길이를 자를 수 있는 길이의 범위로 설정하고 탐색을 하였다. 현재 위치에서 나무를 잘랐을 경우 n과 같거나 n보다 긴 경우는 최솟값의 범위를 줄이고 그 반대의 경우는 최댓값의 범위를 줄인다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int m, n;
int ans = -1;
vector<int> v;
cin >> m >> n;
for (int i = 0; i < m; i++) {
int num;
cin >> num;
v.push_back(num);
}
sort(v.begin(), v.end());
int left = 0;
int right = v[v.size() - 1];
while (left <= right) {
long long int sum = 0;
int mid = (left + right) / 2;
for (int i = 0; i < m; i++) {
if (mid < v[i]) {
sum = sum + (v[i] - mid);
}
}
if (sum >= n) {
ans = mid;
left = mid + 1;
}
else {
right = mid - 1;
}
}
cout << ans;
}
'백준' 카테고리의 다른 글
백준2493 - 탑 (0) | 2019.12.24 |
---|---|
백준9935 - 문자열 폭발 (0) | 2019.12.23 |
백준2512 - 예산 (0) | 2019.12.04 |
백준1987 - 알파벳 (0) | 2019.12.04 |
백준2596 - 비밀편지 (0) | 2019.12.02 |