原题:https://fjnuacm.top/d/contest/p/29?tid=635bad6e691055e12dce5282

题意

带佐在数轴上。\(0\) 时刻,带佐位于 \(0\) 处。在时刻 \(i−1\)\(i\) 之间的时间段中,带佐要么待在当前位置,要么向左或向右跳 \(i\) 个单位长度。输出带佐最早在哪个时刻可以到达 \(X\)

思路

首先,结论是:首项为 \(1\),公差为 \(1\) 的等差数列的前 \(n\) 项和满足 \(S_n > x\) 的最小 \(n\) 即为答案。

下面给出证明思路:

  1. 上述结论的做法是: 令 \(m = 满足条件的最小 n\)\(t = Sm - x\),则只需在 \(t\) 时刻停留即可保证最后一步恰好走到 \(x\)

  2. 上述结论的合理性: ① 我们不可能折回,因为折回后如果直接返回,只能前进 \(1\),代价大于在 \(t\) 时刻停留的代价(可以根据等差数列理解,列方程来严格证明),而停留后返回代价明显更大(停留需要很长时间,而折回后返回前进的距离远没有这么长)。 ② 我们不可以停留太久,显然停留一次比停留多次代价小。

因此,用一个 \(while\) 轻松解决。

值得注意的是,上述证明不严密。

对应AC代码

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        long x = scanner.nextLong(), t = 0, i = 1;
        while(t < x){
            t += i;
            i ++;
        }
        System.out.println(i - 1);
    }
}

暴力就完事了