这道题大意是这样的:
给你从1到n的n个数,要求使 ?1?2...?n=k 成立,其中?表示正负号未定,在这样的情况下,求最小的n是多少。
这道题如果顺着思考,确实不太好想,但如果逆向思考的话,会有出其不意的效果:
假设 存在一个这样的最小数 n 使得(1)式: ?1?2...?n=k 成立,那么对应的一定有 (2)式: 1+2+...+n >=k 成立 ;这是肯定的,因为在(1)式左边有正有负,而(2)式对应的全是正号(即使(1)式左边也全是正号,那么(2)式=k,符合条件 >= ,即依然成立);
现在让我们来考虑 (1)式和(2)式的区别,设(1)式左边部分的和为sum1,(2)式左边部分的和为sum2,那么可得: sum2-sum1 = sum2 - k = W,其中这个W(也就是它们的差)一定是个偶数,至于为什么一定是偶数,原因如下:
设 (1)式左边部分为负数的某一项为 ( -) i ,那么在(2)式中对应的就为 (+)i,因为 (+)i - (-) i = 2i,很显然 2i 是偶数, 所以 sum2 - sum1 = 偶数。
到这里,其实就没必要再往下继续思考了,假如我们用暴力求解的话,这就是我们的判决条件了。
AC代码如下:
#include<stdio.h>
int main(){
#ifdef LOCAL
freopen("10025_input.txt","r",stdin);
freopen("10025_output.txt","w",stdout);
#endif
int k,i,j,CASENUM,sum;
scanf("%d",&CASENUM);
for(i=0;i<CASENUM;i++){
scanf("%d",&k);
if(k<0)
k*=-1;
j=0;
sum=0;
do{
sum+=(++j);
}while(!(sum>=k&&(sum-k)%2==0));
printf("%d\n",j);
if(i<CASENUM-1)
printf("\n");
}
return 0;
}