https://acmicpc.net/problem/1789
티어 - Silver 5
알고리즘 분류 - 수학
, 그리디 알고리즘
나의 해결 방안 - 이분 탐색
문제
서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?
입력
첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.
출력
첫째 줄에 자연수 N의 최댓값을 출력한다.
#include <iostream>
#include <vector>
using namespace std;
int main(void) {
long long innum;
cin >> innum;
if (innum<=2) {
cout << 1;
return 0;
}
long long left=1, right=200000, mid;
while (left<=right) {
mid=(left+right)/2;
long long midsum=mid*(mid+1)/2, midp1sum=(mid+1)*(mid+2)/2;
if (innum>=midsum && innum<midp1sum) break;
else if (innum<midsum) right=mid-1;
else left=mid+1;
}
cout << mid;
}