就是给出一个数,最少能用多少个数表示。
每个数前面为正号或者负号。
可以只考虑正数(输入的负数当正数也行。算出正数的符号全变就行,数字不会改变);
先把前n项和的值存入数组,直到大于1e9,题目给的最大值。
然后判断所给的数字在前k与k+1项的和之间,然后判断与小的那个差,若为奇数,则最少数+1,直到为偶数。
因为每次将一个负号变成正号的时候,是减去两倍的这个数,必为偶数。
还有,注意为0的特殊情况。
#include<cstdio>
#include<cstring>
const int MAXN=1e6;
int store[MAXN]={0};
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int i;
for(i=1;store[i-1]<=1e9;i++){
store[i] = store[i-1]+i;
}
store[i]=store[i-1]+i+1;
int T;
scanf("%d",&T);
while(T--){
int k,temp;
scanf("%d",&k);
if(k==0) {printf("3\n",k);if(T)printf("\n");continue;}
if(k<0) k= -k;
int head=0,tail=i,middle=(head+tail)/2;
for(;!(store[tail-1]<k&&k<=store[tail]);){
if(k>=store[head]&&k<store[middle]) tail=middle;
else if(k>store[middle]&&k<=store[tail]) head=middle;
else if(k==store[middle]){temp=middle;break;}
middle=(head+tail)/2;
temp = tail;
}
while((store[temp]-k)%2!=0) temp++;
printf("%d\n",temp);
if(T) printf("\n");
}
return 0;
}