10 条题解

  • 0
    @ 2024-7-14 13:59:30

    题意:

    要从起点 (1,1)(1,1) 的位置走到 (n,m)(n,m) 的位置,走第奇数次步时可以向上下左右一个方向走奇数个单位长度,第偶数次步时走偶数个单位长度,求最小需要多少步。

    思路:

    把网格看做一个大小为 n×mn \times m 的网格,要使步数小,那么每次就尽量走到底。

    用样例举例:

    8 7
    

    (1,1)(1,1) 出发,到 (8,1)(8,1) 的距离刚好是奇数,算一步。从 (8,1)(8,1) 出发,到 (8,7)(8,7) 的距离刚好是偶数,算一步。最后答案就是 22 步。

    999999 1000000
    

    (1,1)(1,1) 出发,到 (1,1000000)(1,1000000) 的距离刚好是奇数,算一步。从 (1,1000000)(1,1000000) 出发,到 (999999,1000000)(999999,1000000) 的距离刚好是偶数,算一步。最后答案就是 22 步。

    3 3
    

    (1,1)(1,1) 出发,到 (1,2)(1,2) 的距离是奇数,算一步。从 (1,2)(1,2) 出发,到 (3,2)(3,2) 的距离是偶数,算一步。从 (3,2)(3,2) 出发,到 (3,3)(3,3) 的距离是奇数,算一步。最后答案就是 33 步。

    从前两个样例中可以看出若 nnmm 中有一个为奇数且另一个为偶数,那么需要的步数最小为 22。这条结论也不难证明,因为这样走的两个方向的距离是一个奇数和一个偶数,刚好可以走两步,所以答案为 22

    从第三个样例可以看出若 nnmm 都是奇数时,最小步数为 33,这也不难证明,在结论一的基础上我们可以证明这条结论,一个奇数与一个偶数(结论一的条件)和两个奇数(结论二的条件)只改变了一个数,就是偶数变成了奇数,偶数与奇数的差是奇数,第三步刚好是走奇数步,所以得到了第二条结论。

    现在考虑了两个奇数的情况与一奇一偶的情况,还剩下一个两个偶数的情况。在此情况下,所需最小步数为 33,这也可以在结论一的基础上证明,与证明结论二的方法基本相同。两个偶数与一奇一偶改变一个数,奇数变成了偶数,偶数与奇数的差为奇数,第三步刚好是走奇数步,所以得到了第三条结论。

    将上面三个结论总结一下,就是当 nnmm 中有一个奇数和一个偶数,那么只需要走 22 步,否则要走 33 步。

    代码:

    #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
    上传者