10 条题解
-
0
题意:
要从起点 的位置走到 的位置,走第奇数次步时可以向上下左右一个方向走奇数个单位长度,第偶数次步时走偶数个单位长度,求最小需要多少步。
思路:
把网格看做一个大小为 的网格,要使步数小,那么每次就尽量走到底。
用样例举例:
8 7
从 出发,到 的距离刚好是奇数,算一步。从 出发,到 的距离刚好是偶数,算一步。最后答案就是 步。
999999 1000000
从 出发,到 的距离刚好是奇数,算一步。从 出发,到 的距离刚好是偶数,算一步。最后答案就是 步。
3 3
从 出发,到 的距离是奇数,算一步。从 出发,到 的距离是偶数,算一步。从 出发,到 的距离是奇数,算一步。最后答案就是 步。
从前两个样例中可以看出若 与 中有一个为奇数且另一个为偶数,那么需要的步数最小为 。这条结论也不难证明,因为这样走的两个方向的距离是一个奇数和一个偶数,刚好可以走两步,所以答案为 。
从第三个样例可以看出若 与 都是奇数时,最小步数为 ,这也不难证明,在结论一的基础上我们可以证明这条结论,一个奇数与一个偶数(结论一的条件)和两个奇数(结论二的条件)只改变了一个数,就是偶数变成了奇数,偶数与奇数的差是奇数,第三步刚好是走奇数步,所以得到了第二条结论。
现在考虑了两个奇数的情况与一奇一偶的情况,还剩下一个两个偶数的情况。在此情况下,所需最小步数为 ,这也可以在结论一的基础上证明,与证明结论二的方法基本相同。两个偶数与一奇一偶改变一个数,奇数变成了偶数,偶数与奇数的差为奇数,第三步刚好是走奇数步,所以得到了第三条结论。
将上面三个结论总结一下,就是当 与 中有一个奇数和一个偶数,那么只需要走 步,否则要走 步。
代码:
#include<bits/stdc++.h> #define int long long using namespace std; int t; signed main(){ cin>>t; while(t--){ int n,m; cin>>n>>m; if((n%2==1 and m%2==0) or (n%2==0 and m%2==1))cout<<2<<endl; else cout<<3<<endl; } return 0; }
信息
- ID
- 7
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 346
- 已通过
- 242
- 上传者