C++ ) 1561 놀이공원

Blue·2023년 5월 18일
0

접근

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;
}
profile
할수있다가 아닌 해야한다!!

0개의 댓글

관련 채용 정보