N 명의 아이들이 1인승 놀이기구를 기다리고 있고, 놀이공원에는 M 개의 놀이기구가 있다.
1부터 M 까지 번호가 있다한다.
각각 운행 시간있어서 그 시간이 지나면 타고 있던 아이는 내리고 다음 아이가 탄다.
여러 개의 놀이기구가 비어있으면 더 작은 번호가 있는 놀이기구 탑승한다.
1 <= N <= 2000000000 그리고 1<=M<=10000 이 범위가 된다.
나는 값을 보자마자 이분탐색으로 생각했다.
먼저 운행시간을 보고 그 운행시간에 N명이 타있는 그 시간을 구했다.
N<=M 이라면 굳이 할필욘 없고 그 반대 되는 조건이라면 값을 먼저 구해준다.
그리고 그 값으로 처음부터 순서들을 정해주고 마지막 아이의 번호를 나타내 주면 된다.
#include <iostream>
#include <algorithm>
# define MAX 10000
using namespace std;
int N, M;
int ride[MAX];
long long binarySearch(void)
{
long long low = 0, high = 2000000000LL * 30LL;
long long result = -1;
while (low <= high)
{
long long mid = (low + high) / 2;
long long children = M;
for (int i = 0; i < M; i++) {
children += mid / ride[i];
}
if(children>= N)
{
result = mid;
high = mid - 1;
}
else {
low = mid + 1;
}
}
return result;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> N >> M;
for (int i = 0; i < M; i++) {
cin >> ride[i];
}
if (N <= M)
{
cout << N << "\n";
return 0;
}
long long time = binarySearch();
long long children = M;
for (int i = 0; i < M; i++) {
children += (time - 1) / ride[i];
}
for (int i = 0; i < M; i++)
{
if (!(time % ride[i]))
children++;
if(children == N)
{
cout << i + 1 << "\n";
break;
}
}
return 0;
}