알고리즘
백준 3079번 입국심사 C++
영춘권의달인
2021. 12. 19. 11:59
이분 탐색으로 시간을 탐색하면서 시간 내에 검사를 다 할 수 있으면 시간을 줄이고, 할 수 없으면 시간을 늘리는 방식으로 문제를 해결하였다.
주의해야할 점은 사람의 수의 최대는 10^9 이고, 걸리는 시간의 최대도 10^9 이기 때문에 최악의 경우에는 10^18이 나올 수도 있다. 그러므로 long long을 사용해야 한다.
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
ll n, m;
vector<ll> v(100001);
bool solve(ll mid) {
ll cnt = 0;
for (int i = 0; i < n; i++) {
cnt += mid / v[i];
}
if (cnt >= m) return true;
return false;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
ll max_time = -1;
for (int i = 0; i < n; i++) {
cin >> v[i];
max_time = max(max_time, v[i]);
}
ll left = 0;
ll right = max_time * m;
ll ans = right;
while (left <= right) {
ll mid = (left + right) / 2;
if (solve(mid)) {
right = mid - 1;
ans = min(ans, mid);
}
else {
left = mid + 1;
}
}
cout << ans;
};