1546. 升级

如果对每一个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))