题目地址:点击打开链接
题意:你手里有N个球,现在需要用你手里尽可能多的球使得这个游戏经过多次游戏后形成一种恒定状态
思路:最后形成一种恒定状态的情况是每个盒子里放得球数一定是个连续的序列,1, 1 2, 1 2 3, 1 2 3 4....因为只有这样从任意一个框里取出一个球放到另一框后再排序,得到的还是原来的序列。
所以知道这后只要求比n小的最大前n项和即可,可以用二分来找。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
int main(void)
{
int t, ca = 1;
cin >> t;
while(t--)
{
ll n, l = 0, r = 2e9, ans;
scanf("%lld", &n);
while(l <= r)
{
ll mid = (l+r)/2;
ll sum = (1+mid)*mid/2;
if(sum <= n) ans = sum, l = mid+1;
else r = mid-1;
}
printf("Case #%d: %lld\n", ca++, ans);
}
return 0;
}