如果对每一个n,直接使用for一级一级地模拟升级,由于数据庞大,将会超时。
注意到题目给定的是一个等差数列,设第n级升到第n+1级需要a_n经验,则a_n=n,前n项和是S_n=\dfrac{n(n+1)}2,意义为从第1级升n级(即升到第n+1级)需要\dfrac{n(n+1)}2点经验。设S_i=n,解得i=\dfrac{-1\pm\sqrt{1+8n}}{2}。也就是说获得了n点经验后,可以升到第i+1级。由于获满了经验才可以升级,所以只取整数部分。考虑到实际意义,舍去负根,故答案为(\lfloor x\rfloor代表有理数x的下取整): \left\lfloor1+\dfrac{-1+\sqrt{1+8n}}2\right\rfloor 注意到int的最大值约为2\times10^9,当n\to10^9时,8n超过了int最大值,可以考虑计算过程转化为double或long long。
参考代码如下:
C语言代码:
#include <stdio.h>
#include <math.h>
int n, t;
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
printf("%d\n", int(1 + (sqrt(1 + 8LL * n) - 1) / 2));
}
return 0;
}
Python代码:
for i in range(int(input())):
n = int(input())
print(int(1+((1+8*n)**0.5-1)/2))