思想:
首先,两组数据,必须满足具有相同的除数和余数,否则输出-1。即满足 A/a==B/b&&A%a==B%b。
其次,只考虑A和a即可。首先找到a满足至少乘以多少次2,满足最接近A。使用c表示a最接近A的数据,num表示a乘以2的次数。
用d表示A-c的值。因为如果先加1,再乘2相当于,加了2. 所以求先加1的次数。用x1表示,最后有余数就再加1即可。
代码如下:
#include<iostream>
using namespace std;
void aa(int A, int a, int* x,int* i)
{
while(A-*x>0)
{
*x=*x*2;
*i=*i+1;
}
*x=*x/2;
*i=*i-1;
}
int main()
{
int a,b,A,B;
while(cin>>a>>b>>A>>B)
{
if(A/a==B/b&&A%a==B%b)//同时满足可以凑齐数字,否则输出-1
{
//只考虑一组A和a
int c=0,num=0;//num表示 a乘以2多少次接近A,c表示num个2乘以a后的值
c=a;
aa(A,a,&c,&num);
int d=0; //d表示最大差值
d=A-c;
if(num==0)
{
cout<<d<<endl;
}
else
{
int x1=0,x2=0;
x1=d/2; //表示可以执行先加+1,再乘的加的次数
x2=d%2;
cout<<num+x1+x2<<endl;
}
}
else
{
cout<<-1<<endl;
}
}
return 0;
}
本文介绍了一个具体的算法挑战问题,通过数学运算和编程技巧来解决如何将一个数值通过一系列特定操作转换为另一个数值的问题。文章详细阐述了解决方案的思路,包括如何寻找最接近目标值的操作次数,以及如何计算最小操作步骤。
893

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



