原题:https://fjnuacm.top/d/contest/p/29?tid=635bad6e691055e12dce5282
题意
带佐在数轴上。\(0\) 时刻,带佐位于 \(0\) 处。在时刻 \(i−1\) 和 \(i\) 之间的时间段中,带佐要么待在当前位置,要么向左或向右跳 \(i\) 个单位长度。输出带佐最早在哪个时刻可以到达 \(X\)。
思路
首先,结论是:首项为 \(1\),公差为 \(1\) 的等差数列的前 \(n\) 项和满足 \(S_n > x\) 的最小 \(n\) 即为答案。
下面给出证明思路:
上述结论的做法是: 令 \(m = 满足条件的最小 n\),\(t = Sm - x\),则只需在 \(t\) 时刻停留即可保证最后一步恰好走到 \(x\)。
上述结论的合理性: ① 我们不可能折回,因为折回后如果直接返回,只能前进 \(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);
}
}
暴力就完事了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Blog - Floating Ocean!
评论