题意很简单
思路也不难
找不超过n的最大前k项和
(k(k+1))/2=n
求解该方程
或者用二分查找
但是求解方程明显更快,思路更清晰
用求根公式带入,直接求得
但是!!!
只要跟开根号扯上关系,数的精度问题都很成问题
这时候再附加个判断,校准一下答案
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
int tt=1;
while(t--)
{
long long sum,n;
scanf("%lld",&n);
sum=(sqrt(1.0+8.0*n)-1.0)/2.0;
long long sun=sum;
if(sun*(sun+1)/2<=n)
sun=sun*(sun+1)/2;
else sun=sun*(sun-1)/2;
printf("Case #%d: %lld\n",tt++,sun);
}
return 0;
}
当然,不校准也可以写
但是小心WA
AC代码
#include<bits/stdc++.h>
using namespace std;
int step=0;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long n;
scanf("%lld",&n);
long long x=(sqrt((long double)8*n+1)-1)/2;
long long ans=x*x+x;
ans=ans/2;
printf("Case #%d: %lld\n",++step,ans);
}
}