https://www.acmicpc.net/problem/11561
1. 분류
이분탐색
2. 풀이
최대로 밟을 수 있는 징검다리의 개수를 구하는 문제이다.
1~N까지의 징검다리가 있는데, 어디서 시작하던지는 상관 없다.
단, 다음 단계는 이전 단계보다 무조건 1개 이상 더 멀리 뛰어야 하며 N번째 징검다리는 반드시 밟아야 한다.
이 때 최대로 밟을 수 있는 개수는 무조건 첫 번째 징검다리부터 시작하는 것이다.
앞에서부터 1, 2, 3, ..., N항이라고 할 때 어짜피 이전 단계보다 1 이상만 더 멀리 뛰면 되기 때문에 N-1항과 N항의 거리는 상관 없고
1, 3, 6, 10, 15, ..., N 순서대로 뛰면 최대 개수가 될 것이다.
시작 항이 1인 등차수열의 공식 N * (N-1) / 2에 적합한 N값을 이분 탐색으로 찾아내면 끝이다.
3. 소스코드
#include <cstdio>
typedef unsigned long long ll;
ll chk(ll x)
{
return x * (x + 1LL);
}
int main()
{
int t;
for (scanf("%d", &t); t > 0; t--)
{
ll n;
scanf("%llu", &n);
ll low = 1LL, high = n, mid = 1LL;
while (low <= high)
{
mid = (low + high) / 2LL;
if (chk(mid) > n * 2)
high = mid - 1LL;
else
low = mid + 1LL;
}
if (chk(mid) > n * 2) mid--;
printf("%llu\n", mid);
}
return 0;
}
'알고리즘' 카테고리의 다른 글
| BOJ [1654] 랜선 자르기 (0) | 2017.08.13 |
|---|---|
| BOJ [14501] 퇴사 (0) | 2017.08.13 |
| BOJ [1725] 히스토그램 (0) | 2017.08.12 |
| BOJ [14627] 파닭파닭 (0) | 2017.08.12 |
| 알고리즘 공부를 시작하기 전 메모했던 것들 (0) | 2017.08.10 |