CF 11B
-
题目
-
分析
x x x : 最终要移动到的坐标 i n p u t input input
第 i i i 次移动的距离为 i i i ,从坐标为 0 0 0 开始,可知 坐标为 U = 1 , 3 , 6 , 10... U = {1,3,6,10...} U=1,3,6,10... 这些数字的移动到的次数一定是最小。这提示可以先移动到这些数字的坐标上,再针对不是这些数字的 x x x 在进行移动。开始的想法是先移动到比 x x x 小的最接近 x x x 的那些数 a ∈ U a \in U a∈U 。这样的想法不对。应该先到达比 x x x 大的那些数 a ∈ U a \in U a∈U , 可算出 s u m = a − x sum = a - x sum=a−x 想办法使得 s u m = = 0 sum == 0 sum==0 , 如果 s u m sum sum 是偶数 ,那么 可以在第 s u m 2 \frac{sum}{2} 2sum 次向左走,这样走的路数和没有加上 s u m 2 \frac{sum}{2} 2sum ,反而减去了 s u m 2 \frac{sum}{2} 2sum ,这样一来一去 就减去了 s u m sum sum 即得到答案。如果 s u m sum sum 是奇数就一直往前找即可。
-
代码
const int N = 1e6 + 6; ll a[N]; int main () { //freopen("input.in", "r", stdin); //freopen("test.out", "w", stdout); int x; cin >> x; x = abs(x); if (x == 0) { cout << 0 << endl; return 0; } ll sum = 0; int i = 0; for (i = 1;; i++) { sum += i; if (sum == x) break; if (sum > x && (sum - x) % 2 == 0) break; } printf("%d\n", i); return 0 ; }
-
题型
思维题