백준/실버

[백준 11561번] 징검다리 (C++)

게임개발기원 2023. 5. 28. 15:18

문제링크 : https://www.acmicpc.net/problem/11561

 

11561번: 징검다리

각 테스트 케이스마다 한 줄에 승택이가 밟을 수 있는 최대 징검다리 수를 출력한다.

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    int T;
    cin >> T;
    
    while(T--)
    {
        ll N, result = 0;
        cin >> N;

        ll l = 1, r = sqrt(N) * 2;
        while(l<=r)
        {
            ll mid = (l+r)/2;
            if (mid * (mid+1) <=2*N) // m(m+1)/2 <= N
            {
                result = max(result, mid);
                l = mid + 1;
            }
            else r = mid - 1;
        }
        cout << result << "\n";
    }


    return 0;
}

이분탐색을 이용한 문제이다.

규칙을 보면, 1 + 2 + 3 + 4 + ....... (N-1) + N번으로 이는 등차수열이다.

따라서 m(m+1)/2로 표현이 가능하며 여기서 m이 mid 값이다.

해당 등차수열의 값이 N보다 작을 때의 최대값을 구하면 된다.