题意:
Jack在数轴上跳。他第i次跳可以往左或往右跳i个单位。现在问你他最少花多少步跳到点x。
思路:
可以不管x正负把x变成正数。这样是等效的。然后他最快的跳法当然是往一个方向一直跳。如果这样恰好能到x。这样肯定是步数最小的解。如果不能恰好跳到。我们设按这种方法跳第一个比x大的位置为y。如果y-x是偶数的话。我们还是可以达到最优步数。就是先将第(y-x)/2步往左跳。其它不变。那么恰好也能到x。如果为奇数。变成下一个偶数就行了。为什么可以这样呢。因为不管怎样。x=(±1)+(±2)+(±3)+.......(±n)。所以要想跳到必须奇偶性一致。比y小一定不行、所以只有在y右边找了。
详细见代码:
#include<bits/stdc++.h>
int main()
{
int tp,x,ans;
while(~scanf("%d",&x))
{
x=x<0?-x:x,ans=ceil((-1+sqrt(1+8.0*x))/2),tp=ans*(ans+1)/2-x;
while(tp&1) ans++,tp+=ans;
printf("%d\n",ans);
}
return 0;
}