
首先大家不要被题目迷惑,不可能有-1的情况,原因:两个相邻的整数可以组成1和-1,所有无论L是多少,都可以用多个相邻的整数对想加得出。
总距离和 S=x(x+1)/2
最终位移为 S−2k(k 为负向子集和),故位移必与 S同奇偶,且绝对值 ≤S。
要到达距离 L,需满足:
- S≥L
- S≡L(mod2) :同余
求最小 xx
- 二分查找最小 x 使 x(x+1)2≥L
- 从该 x 开始依次增大,计算 S=x(x+1)/2
- 检查 Smod2==Lmod2是否成立。
- 第一个满足的 x 即为最小能量。
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long L = sc.nextLong();
long low = 0;
long high = 2000000000L;
while (low < high) {
long mid = low + (high - low) / 2;
long tri = mid * (mid + 1) / 2;
if (tri >= L) {
high = mid;
} else {
low = mid + 1;
}
}
long x = low;
long tri = x * (x + 1) / 2;
long lPar = L % 2;
while (tri < L || (tri % 2 != lPar)) {
x++;
tri += x;
}
System.out.println(x);
}
}