※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 18324번 문제인 Race이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/18324
18324번: Race
Bessie is running a race of length $K$ ($1\le K\le 10^9$) meters. She starts running at a speed of 0 meters per second. In a given second, she can either increase her speed by 1 meter per second, keep it unchanged, or decrease it by 1 meter per second. For
www.acmicpc.net
BOJ#1011의 아이디어를 응용하여 해결할 수 있는 문제이다.
이동하는 데에 사용할 시간을 T라고 하자.
T가 커질 수록 그 시간동안 이동할 수 있는 총 거리는 증가하므로, 가능한 전체 시간의 범위를 두고 이진탐색(binary search)를 통해 T를 찾는 방법을 시도할 수 있다.
다만 T를 직접 변수로 이용하면 식을 세우기 쉽지 않으므로, 글쓴이는 "도달한 최고 속도"를 기준으로 그 때 이동할 수 있는 거리를 구해 이진탐색을 진행했다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll dist, Q; cin >> dist >> Q;
while (Q--) {
ll K; cin >> K;
if (K * (K + 1) / 2 >= dist) {
ll L = 1, R = K;
while (L < R) {
ll mid = (L + R) / 2;
if (mid * (mid + 1) / 2 >= dist) R = mid;
else L = mid + 1;
}
cout << L << '\n';
}
else {
ll KK = K * (K - 1) / 2;
ll L = K, R = 100000;
while (L < R) {
ll mid = (L + R) / 2;
if (mid * mid - KK >= dist) R = mid;
else L = mid + 1;
}
if (L * (L - 1) - KK >= dist) cout << 2 * L - K - 1 << '\n';
else cout << 2 * L - K << '\n';
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 8986 // C++] 전봇대 (0) | 2021.09.12 |
---|---|
[BOJ 15809 // C++] 전국시대 (0) | 2021.09.11 |
[BOJ 12722 // C++] Mousetrap (Large) (0) | 2021.09.09 |
[BOJ 8741 // C++] 이진수 합 (0) | 2021.09.08 |
[BOJ 18222 // C++] 투에-모스 문자열 (0) | 2021.09.07 |