1 条题解
-
0
好的,这里是一个详略适中的题解版本:
题意
从 走到 ,。
移动规则:
- 第 (奇数)步必须沿 轴方向
- 第 (偶数)步必须沿 轴方向
- 每一步移动的距离是正整数,且严格大于上一步的距离
- 可以沿正方向或负方向移动(但为了到达正坐标,通常只考虑正方向)
求最少步数,若不可能则输出 。
关键观察
设步数为 :
-
若 为偶数,:
由 个奇数步的代数和得到
由 个偶数步的代数和得到 -
若 为奇数,:
由 个奇数步的代数和得到
由 个偶数步的代数和得到
由于步长严格递增,最小的 个奇数步之和为
最小的 个偶数步之和为
可行性分析
情况1:(两步)
- 第一步( 方向)走 ,第二步( 方向)走 ,且
- 到达 ,所以 ,
- 条件: 且
结论: 时两步可达,步数为 。
情况2:(三步)
- 步长 , 沿 轴, 沿 轴
- 到达 ,即 ,
- 需要存在正整数 满足 且 ,
构造方法:取 ,,则需 且满足
即 且结论: 且 时三步可达,步数为 。
情况3:(一步)
- 第一步沿 轴,只能到达 ,但 ,所以不可能
情况4:
- 当 和 都不满足时,能否用更多步数实现?
- 可以证明(通过分析最小和与递增限制):若 和 均不可行,则任何 也不可行
- 原因:当 且不满足 条件时, 和 都太小,无法分配递增步长
特殊情况:
- 需要 ,不满足
- 需要 ,不满足
- 任何更多步数,第一步至少 ,第二步至少 ,第三步至少 , 至少 ,不可能
→ 输出
最终结论
对于每个测试用例 :
- 若 且 ,输出
- 否则若 ,输出
- 否则若 且 ,输出
- 否则输出
时间复杂度
,每个测试用例 判断。
C++ 代码
#include <iostream> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { long long x, y; cin >> x >> y; if (x == 1 && y == 1) { cout << "-1\n"; } else if (x < y) { cout << "2\n"; } else if (y >= 2 && x >= y + 2) { cout << "3\n"; } else { cout << "-1\n"; } } return 0; }
- 1
信息
- ID
- 7072
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者