题目:有这样一种编排,第一组有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; }
时间: 2024-12-28 01:14:19