题目大意
给出三个数 a ≤ b ≤ c a \leq b \leq c a≤b≤c,现在每次可以将一个数 + 1 +1 +1或者 − 1 -1 −1,每次移动步数加一,但不能减到小于等于 0 0 0。现在求若移动到 c % b = = 0 & & b % a = = 0 c\%b==0 ~~\&\& ~~b\%a==0 c%b==0 && b%a==0最小的移动总步数
解题思路
我们知道,整除关系也是倍数关系,那么我们在素筛那里是如何处理每个确定是素数的倍数呢?每次加上这个数的大小!那么这时我们发现可以一个三重循环,第一层 i i i暴力到数的最大范围,第二层 j j j每次增加 i i i,第三层 k k k每次增加 j j j,这样保证了整除关系的三个数的枚举,再维护一个最小值即可。注意数的范围要比10000大一些,第一次10010却WA了,第二次11000就过了
代码:
#include <iostream>
#include <math.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=11000;
int a,b,c,t;
int main()
{
int x,y,z,ans,res;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&x,&y,&z);
ans=INF;
for(int i=1;i<=maxn;i++)
for(int j=i;j<=maxn;j+=i)
for(int k=j;k<=maxn;k+=j){
res=abs(i-x)+abs(j-y)+abs(k-z);
if(res<ans){
ans=res;
a=i,b=j,c=k;
}
}
printf("%d\n",ans);
printf("%d %d %d\n",a,b,c);
}
return 0;
}