1. 程式人生 > >急眼的曹大神

急眼的曹大神

急眼的曹大神

題目描述

話說有這麼一天, 曹大神正走在去上課的路上,突然他發現,似乎馬上就要遲到了,急的他馬上跳了起來(急的不能正常走路了 O(∩_∩)O哈哈~~)。現在假設曹大神的位置在(0,0),教室的位置在(x,0)。
曹大神第i次跳只能跳 i 的距離,幫曹大神算一下他最快能跳多少次就到教室,算對了曹大神可是會有感謝的喲~(每次跳躍可以向左也可以向右)

分析:

曹大神可以向左跳或者向右。因為要最快且正好跳到教室。我們假設,曹大神在第A次跳的時候,跳過了教室。那麼曹大神要跳回去。通過假設我們會發現,在第一次至第A次的時候,中間肯定不是單純的向一個方向跳,而是,左右結合跳,那麼我們先假設他一直往教室的方向跳,且第A次跳過了教室。如果第A次跳過了教室且與教室的距離為一個偶數,即(sum為第A次跳的距離)sum-x如果為偶數,則在第一次至第A次的時候之中,必定可以通過左右跳,來抵消多餘的,如果為一個奇數,則一定不可以,那麼我們只能通過再跳一次,繼而繼續判斷是不是偶數。

int main()
{
    long long a,x,t,i,n,m,j,sum;//SUM儲存跳的距離
    while(~scanf("%lld",&t))
    {
        while(t--)
        {  scanf("%lld",&n);
           if(n==0)//如果n=0,即與教室的距離為0,不用跳
           {
               printf("%d\n",0);
               continue;
           }
           sum=0;
           if(n<0)//因為n可能為負數,所以需要判斷
              n=-n;
           for(i=1;;i++)
           {
              sum=sum+i;//一直累計前i次跳的距離
              if((sum-n)%2==0&&sum-n>=0)/*//sum-n〉0是因為有可能出現小於0且為偶數的可能性*/
                 break;
           }
           printf("%lld\n",i);
        }
    }
}