반응형
3079번: 입국심사
첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ M ≤ 1,000,000,000) 다음 N개 줄에는 각 심사대에서 심사를 하는데 걸리는 시간인 Tk가 주어진다. (1 ≤ Tk ≤ 109)
www.acmicpc.net
이분탐색 문제였습니다.
풀이방법
1부터 가장 오래걸리는 입국심사대의 시간*m명의 범위에서 소요시간을 탐색하면 답을 구할 수 있습니다.
심사대마다 처리할 수 있는 사람 명 수는 각 걸리는 소요시간 / 심사대의 심사 소요시간이 됩니다.
따라서 모든 심사대마다 해당공식을 적용하여 나온 결과값을 더한 결과가 m명 이상일 때 소요시간에 대한 답을 구한 것이고 이들 소요시간 답들 중 최소값이 우리가 구하려는 답입니다.
*탐색 범위를 주의해야합니다. int는 대략 21억까지의 정수를 저장할 수 있는 자료형입니다. 따라서 int 범위를 넘을 수 있으니 처리할 수 있는 자료형으로 변수를 선언해 주시는 것이 답을 맞추는 지름길입니다
Code
#include <iostream>
#include <algorithm>
#define ll long long
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
ll n,m;
ll times[100001];
ll MAX;
ll binarySearch(){
ll ansTime = MAX * m;
ll l = 1;
ll r = MAX * m;
while(l<=r){
ll mid = (l+r)/2;
ll sum =0;
for(ll i = 0; i < n; i++){
sum += mid / times[i];
}
if(sum >= m){
ansTime = min(ansTime,mid);
r = mid - 1;
}
else{
l = mid + 1;
}
}
return ansTime;
}
int main(){
fastio;
cin >> n >> m;
for(ll i = 0; i < n; i++){
cin >> times[i];
MAX = max(MAX,times[i]);
}
sort(times,times+n);
cout << binarySearch() << '\n';
}