题意
你有两个数 a a a 和 b b b,初始值均为 0 0 0,你可以任选一个整数 k k k,进行以下三种操作中的一种:
- 将 a a a 和 b b b 都加 k k k;
- 将 a a a 加 k k k,将 b b b 减 k k k;
- 将 b b b 加 k k k,将 a a a 减 k k k;
对于给定的 c c c 和 d d d,求最少的操作数使得 a = c , b = d a=c,b=d a=c,b=d,若无法得到,则输出 − 1 -1 −1。
分析
我们先假设能够使得 a = c , b = d a=c,b=d a=c,b=d,如果最后一步是操作2或操作3,那么倒数第二步完成后 a a a 和 b b b 必定都等于 c + d 2 \dfrac{c+d}{2} 2c+d,因为 c + d 2 \dfrac{c+d}{2} 2c+d 与 c c c 和 d d d 的差值相等。
显然,从 0 0 0 到达 c + d 2 \dfrac{c+d}{2} 2c+d 只需要一次操作1,则操作的个数最多为 2 2 2。
下面考虑特殊情况:
-
当 c = d = 0 c=d=0 c=d=0 时,显然不需要操作,则答案为 0 0 0;
-
当 c = d ≠ 0 c=d≠0 c=d=0 时,只需一次操作1,则答案为 1 1 1;
-
当 c c c 和 d d d 的奇偶性不相同时,显然无法完成,答案为 − 1 -1 −1 。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int a,b,c,d;
int ans;
void work()
{
scanf("%d%d",&c,&d);
if((c+d)%2!=0)//若奇偶性不同
ans=-1;
else
{
ans=1;
a=b=(c+d)/2;
if(a!=c||b!=d)
ans=2;
}
if(c==0&&d==0)
ans=0;
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
work();
return 0;
}