题目:有这样一种编排,第一组有1个人,第二组有2个人,..,第k组有k个人,现在有n个人,问能构成前几组。
分析:数论,分治。显然这个序列是一个前k项和,那么输出(k+1)*k /2不超过n的最大k值即可;二分或开方。
说明:数据较大,用long long。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef long long LL;
LL bs(LL key)
{
LL L = 0LL,R = 10000000000LL;
while (L < R) {
LL M = (L+R+1LL)/2LL;
if (M*(M+1LL)/2LL > key)
R = M-1;
else L = M;
}
return L;
}
int main()
{
int T;
LL n;
while (cin >> T)
while (T --) {
cin >> n;
cout << bs(n) << endl;
}
return 0;
}