1. 程式人生 > 實用技巧 >CF-1445B Jumps

CF-1445B Jumps

題意

初始時刻,你位於 \(x\) 軸上的 \(0\) 位置處,現在你要到達 \(x(x>0)\) 處,你可以通過跳躍的方式到達。在第 \(k\) 次跳躍,你可以選擇向右跳躍 \(k\) 個單位距離,或者向左跳躍 \(1\) 個單位。求出到達 \(x\) 處的最少步數。

\(1≤t≤1000,1≤x≤10^6\)

分析

假設連續向右跳躍 \(step\) 後到達點 \(pos=\frac{(step+1)·step}{2}\) 處,並且 \(pos\leq x\) 。如果 \(x=pos\) ,那麼 \(step\) 就是答案。如果 \(pos>x\) ,此時也有 \(\frac{(step-1)step}{2}<x\)

,那麼考慮將其中一次向右跳躍改為向左,那麼 \(pos-step-1\leq pos'\leq pos-2\),又因為有:\(pos-step<x<pos\) ,即只要 \(pos-step<x\leq pos-2\),就可以通過替換跳躍步驟中的一步來達到目的,答案仍為 \(step\) 。因此,只需要特判一下 \(x=pos-1\) 的情況即可,答案為 \(step+1\)

總結:難度不大,但是很少會從這個角度去考慮問題。

程式碼

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int t,x;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&x);
        int step=0;
        while(step*(step+1)<2*x)
            step++;
        if(step*(step+1)/2==x+1)
            step++;
        printf("%d\n",step);
    }

    return 0;
}