1. 最短递增路径问题解析
1.1 问题描述与理解
题目要求我们从原点(0,0)出发,通过一系列移动到达目标点(x,y)。每次移动需要交替改变x坐标和y坐标,且每次移动的距离必须严格递增。我们需要找到到达目标点的最少移动次数,如果无法到达则返回-1。
举个例子,假设目标点是(3,5):
- 第一次移动x坐标+1(距离1)
- 第二次移动y坐标+2(距离2)
- 第三次移动x坐标+3(距离3)
这样总共需要3次移动就能到达(1+3, 0+2) = (4,2),但这不是我们要的(3,5)。这个例子说明我们需要更仔细地分析移动规律。
1.2 关键观察与解法
经过分析,我们发现有以下几种特殊情况需要考虑:
-
无解情况:
- 当x == y时:无法满足严格递增的要求
- 当x == y + 1时:最后一次移动无法满足递增
- 当y == 1时:无法进行有效的第二次移动
-
有解情况:
- 当x < y时:最少需要2次移动
- 第一次移动x坐标+x
- 第二次移动y坐标+y(y > x满足递增)
- 当x > y时:最少需要3次移动
- 第一次移动x坐标+1
- 第二次移动y坐标+2
- 第三次移动x坐标+3(此时x-1 >= 3才能到达)
- 当x < y时:最少需要2次移动
1.3 代码实现与优化
cpp复制#include <bits/stdc++.h>
using namespace std;
void solve() {
int x, y;
cin >> x >> y;
if(y == 1 || x == y || x - y == 1)
cout << -1 << endl;
else if(x > y)
cout << 3 << endl;
else
cout << 2 << endl;
}
int main() {
int T;
cin >> T;
while(T--) {
solve();
}
return 0;
}
注意:在实际编程比赛中,我们通常会使用更快的输入输出方式,如io
