题意
你有两个数 aaa 和 bbb,初始值均为 000,你可以任选一个整数 kkk,进行以下三种操作中的一种:
- 将 aaa 和 bbb 都加 kkk;
- 将 aaa 加 kkk,将 bbb 减 kkk;
- 将 bbb 加 kkk,将 aaa 减 kkk;
对于给定的 ccc 和 ddd,求最少的操作数使得 a=c,b=da=c,b=da=c,b=d,若无法得到,则输出 −1-1−1。
分析
我们先假设能够使得 a=c,b=da=c,b=da=c,b=d,如果最后一步是操作2或操作3,那么倒数第二步完成后 aaa 和 bbb 必定都等于c+d2\dfrac{c+d}{2}2c+d,因为 c+d2\dfrac{c+d}{2}2c+d 与 ccc 和 ddd 的差值相等。
显然,从 000 到达 c+d2\dfrac{c+d}{2}2c+d 只需要一次操作1,则操作的个数最多为 222。
下面考虑特殊情况:
-
当 c=d=0c=d=0c=d=0 时,显然不需要操作,则答案为 000;
-
当 c=d≠0c=d≠0c=d=0 时,只需一次操作1,则答案为 111;
-
当 ccc 和 ddd 的奇偶性不相同时,显然无法完成,答案为 −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;
}
本文探讨了如何通过最少操作使两个数a和b等于给定值ccc和ddd,着重于奇偶性条件下的操作优化,包括特殊情况下操作次数的确定,最终提供了一个C++代码实现。
998

被折叠的 条评论
为什么被折叠?



