题目链接:点击打开链接
题意:你手里有N个球,现在需要用你手里尽可能多的球使得这个游戏经过多次游戏后形成一种恒定状态,恒定状态:最后形成一种恒定状态的情况是每个盒子里放得球数一定是个连续的序列,1 1,2 1,2,3 1,2,3,4....
思路:经分析:找一个小于等于n的 等差序列前 k 项和,这个等差序列从 a1 = 1 d = 1 n>=(k*(k+1))/2;
二分枚举k,即可;
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
ll en_fff(ll l,ll r,ll n)
{
ll flag;
while(l<=r)
{
ll mid = (l+r)/2;
ll tt = (mid*(mid+1))/2;
if(tt <= n)
{
flag = mid;
l = mid+1;
}
else
{
r = mid-1;
}
}
return (flag*(flag+1))/2;
}
int main()
{
ll i,j,t,n;
scanf("%lld",&t);
for(i = 1;i<=t;i++)
{
scanf("%lld",&n);
ll k = en_fff(0,10000000000,n);
printf("Case #%lld: %lld\n",i,k);
}
return 0;
}