본문 바로가기
  • Let's study
PS/백준

[C++] 백준 19592: 장난감 경주

by 코딩고수이고파 2023. 4. 12.

문제

https://www.acmicpc.net/problem/19592

 

19592번: 장난감 경주

당신을 포함한 N명의 참가자가 각자 자신의 장난감 자동차를 이용해 경주를 하는데, 트랙의 길이는 X 미터이다. 참가자는 1번부터 N번까지 번호가 매겨져 있고, 당신의 참가 번호는 N번이다. i번

www.acmicpc.net

 

해결방법

1. 자신을 뺀 참가자의 완주하는 데 걸리는 시간을 vector에 넣고 자신의 속도만 따로 speed 변수에 저장한다.

2. vector를 오름차순으로 정렬한다. 이 때 vector[0]은 현재 1등이다.

3. 부스터 없이 완주하는데 걸리는 시간vector[0]보다 작으면 단독 우승이므로 0을 출력한다.

4. 부스터를 다 사용했을 때 남은 거리자신의 속도로 나눈 값 (x-y)/speed부스터 사용에 걸린 1초를 더해준 값이 vector[0]보다 크거나 같으면 단독 우승이 불가능하므로 -1을 출력한다.

5. 이후 부스터 속력을 가지고 이분탐색을 진행해준다. 부스터 사용시간은 1초이므로 속력이 곧 이동한 거리가 된다.

(이동 거리 - 부스터 속력)자신의 속도로 나눈 값부스터 사용에 걸린 1초를 더한 값(완주하는 데 걸린 시간)이 vector[0]보다 작으면 부스터의 속도가 너무 빠른 것이므로 right=mid-1을 한다. 그 반대의 경우에는 left=mid+1을 한다.

6. 이분탐색이 끝나면 left를 출력한다. 자신이 완주하는데 걸린 시간vector[0]이랑 같아도 left에 1이 더해지므로(부스터 속력 증가) 자동으로 단독 우승이 가능해진다. 

 

주의할 점

변수 타입에 유의하자!

 

코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	double t, n, x, y;
	cin >> t;

	while (t--) {
		cin >> n >> x >> y;
		vector<double>v;

		int speed;
		for (int i = 0; i < n; i++) {
			double a;
			cin >> a;

			double time = x / a;
			if (i == n - 1) {
				speed = a;
				break;
			}

			v.push_back(time);
		}

		sort(v.begin(), v.end());

		if (x / speed < v[0]) {
			cout << 0 << '\n';
			continue;
		}
		
		if ((x - y) / speed + 1 >= v[0]) {
			cout << -1 << '\n';
			continue;
		}

		int left = 0, right = y; //속력
		while (left <= right) {
			int mid = (left + right) / 2;

			if ((x-mid)/speed + 1 < v[0]) {
				right = mid - 1;
			}
			else {
				left = mid + 1;
			}
		}
		
		cout << left << '\n';
	}
}

'PS > 백준' 카테고리의 다른 글

[C++] 백 11721: 열 개씩 끊어 출력하기  (0) 2023.04.26
[C++] 백준 2776: 암기왕  (0) 2023.04.13
[C++] 백준 4158: CD  (0) 2023.04.11
[Visual Basic] 백준 14337: Helicopter  (0) 2023.03.15
[FreeBASIC] 백준 2377: Pottery  (0) 2023.03.14

댓글