题意:
给出三个数 : a,b,c,(a≤b≤c) ,可以对任意一个数进行任意次 +1 或 −1 的操作。要求操作之后得到的数 A,B,C,满足:均为正数, A≤B≤C, A可以整除 B, B可以整除 C。
思路:
枚举。
先确定 A 的范围,为 [1,2a] ,如果超过 2a,不如变成 1。
B 的范围: [1,2b] 且为 A 的倍数。
C:确定 B 后,因为 C 必须满足为 B 的倍数,所以只要让 C 变成距离 c 近的 B 的倍数即可。
求出操作次数的最小值即可。
比赛的想过这样做,但因为范围定错了,没写出来。😭
代码:
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int main()
{
int a,b,c,A,B,C,ans,t;
scanf("%d",&t);
while(t--)
{
ans=inf;
scanf("%d%d%d",&a,&b,&c);
for(int i=1;i<=2*a;i++)
{
for(int j=i;j<=2*b;j+=i)
{
int t=c/j;
int t1=t*j,t2=t*j+j;
if(abs(t1-c)<abs(t2-c))
t=t1;
else
t=t2;
int res=abs(i-a)+abs(j-b)+abs(t-c);
if(res<ans)
{
A=i,B=j,C=t;
ans=res;
}
}
}
printf("%d\n",ans);
printf("%d %d %d\n",A,B,C);
}
return 0;
}