乍眼一看,这题找不出什么规律,可是列举出所有的想法时,就有一点思路了。
这题无非是这样:±1 ± 2 ± 3 ±…± n = k , 找出满足条件的最小 n 。
令S(n)=1 + 2 + 3 + ... + n. 其中一项为x.
那么S(n)=1 + 2 + 3 + ...+ x + ... + n. 这样结果可能大于等于 | k | ,等于最好,即一次算出。
所以我们把+ x 改成- x,此时得到新的关系:S'(n)=1+2+...-x+...+n.
=> S(n)-S'(n)=2x;且k=S'(n).令y=2x.
利用这个特性,找出一个满足条件的y(即y是偶数)即可。
但又有问题,那就是数据问题。题目不知一个数据,每个数据范围相当于|k|≤10^9,所以每次要是从1+2+3+...+n直到≥k时为止,这可能费时。
所以我们可利用等差公式前n项和公式,S(n)=n(n+1)/2,可以大致估略n=√2S(n),从这个开始枚举可快很多。
还有一点就是一个特殊的数据,就是k=0时n=3,而不是n=0,因为按照上面想法去实现会产生0,即判断一下当k=0时,输出3即可;其他的没有特殊情况。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int T,k,n,ans,s;
int main()
{
scanf("%d",&T);
for(int t=0;t<T;t++)
{
if(t) printf("\n");
scanf("%d",&k);
if(!k){ printf("3\n"); continue; }
k=abs(k);
n=(int)sqrt(k<<1);
s=n*(n+1)>>1;
while(true)
{
if(s>=k) break;
n++;
s+=n;
}
while((s-k)&1)
{
n++;
s+=n;
}
printf("%d\n",n);
}
return 0;
}