728x90
🤔 문제분석
📝 문제요약
아이들(N)과 놀이기구(M)가 주어지고, 각 놀이기구는 한명만 탈 수 있고 운행시간이 주어졌을때 아이들이 순차로 놀이기구를 탄다고 한다면 마지막 아이가 탄 놀이기구의 번호를 구하는 문제이다.
🎯 필요한 개념
- 이분탐색
✅ 알고리즘
- 아이들을 태울 수 있는 최소 시간을 구한다. ( 이분탐색 )
- 놀이기구를 순회하면서 아이들을 태울 수 있는 카운트를 한다.
- 시간 / 놀이기구[i]
- 아이들을 태울 수 없다면 시간을 줄여본다.
- 아이들을 태울 수 있다면 시간을 늘려본다.
- 놀이기구를 순회하면서 아이들을 태울 수 있는 카운트를 한다.
- 해당 시간에 모두 태일 수 있는 아이들을 뺀다.
- N -= child_cnt
- 다음시간에 놀이기구를 탈 수 있는 경우라면 태우고 그렇지 않으면 태우지 않는다.
- 다음시간 % 놀이기구[i] == 0 인경우 태울 수 있다.
- 그렇지 않은 경우는 태울 수 없는 경우이므로 무시한다.
💻 코드
// <https://www.acmicpc.net/problem/1561>
#include
#include
#include
#include
long long N;
int M;
using namespace std;
vector plays;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N >> M;
plays.resize(M);
for(int i = 0; i < M; i++)
{
cin >> plays[i];
}
if(M >= N)
{
cout << N;
return 0;
}
N -= M;
long long start = 1;
long long end = N * M * 30;
long long cycle = 0;
long long child_cnt = 0;
// 시간안에 아이들을 태울 수 있는 횟수를 구한다.
while(start <= end)
{
auto mid = (start + end) / 2;
long cnt = 0;
for(int i = 0; i < M; i ++)
{
auto v = mid / plays[i];
cnt += v;
}
if (cnt >= N)
{
end = mid - 1;
}
else
{
cycle = mid;
child_cnt = cnt;
start = mid + 1;
}
}
N -= child_cnt;
int idx = 0;
while(N)
{
if((cycle + 1) % plays[idx] == 0) N -= 1;
idx += 1;
}
cout << idx;
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2473번 : 세 용액 (1) | 2024.07.20 |
---|---|
[백준] 1208번 : 부분수열의 합2 (0) | 2024.07.20 |
[백준] 2352번 : 반도체 설계 (0) | 2024.07.20 |
[백준] 9370번 : 미확인 도착지 (0) | 2024.03.24 |
[백준] 14442번 : 벽 부수고 이동하기 2 (0) | 2024.03.24 |