题目的意思就是给你一个数k;
问1?2?3?4?5?6........其中问号可以是加号或者减号,使式子等于k的最短序列。。
思路是,先把式子全部变成加号,直到大于等于k。全加才刚刚大于k,那有加有减就不可能等于k了。所以在这个长度的基础上去加就好。。
然后拿9这个数字来举例,加入你从1加到4等于10,大于9了。。现在你要想办法把加号改成减号,使他等于1.。可是这是不可能的。
因为10 - 1变成9,就算你只是把1改掉,他也会少2(因为加1变成减1一来一回差2).。
所以我们只能在多一位,变成1加到5 等于15,15比9大了6.。这样只要把+3改为-3就可以。。
规律就出来了。。从1开始一直加到大于k,并且和k差是偶数就可以了。。。。
AC代码:
#include<stdio.h>
int main () {
long long k;
long long i;
long long len,res;
int T;
scanf("%d",&T);
while (T--) {
scanf("%lld",&k);
if (k < 0)
k = -k;
for (i = 1 ;(1 + i) * i /2 < k ;i++);
res = (1 + i) * i / 2;
len = i;
while ((res - k) % 2 != 0) {
res += (++len);
}
printf("%lld\n",len);
if(T)
printf("\n");
}
return 0;
}