题意:

给出三个数 : a , b , c , ( a b c ) a,b,c,(a\leq b \leq c) a,b,c,(abc) ,可以对任意一个数进行任意次 + 1 +1 +1 1 -1 1 的操作。要求操作之后得到的数 A , B , C A,B,C A,B,C,满足:均为正数, A B C A\leq B\leq C ABC A A A可以整除 B B B B B B可以整除 C C C

思路:

枚举。
先确定 A A A 的范围,为 [ 1 , 2 a ] [1,2a] [1,2a] ,如果超过 2 a 2a 2a,不如变成 1 1 1
B B B 的范围: [ 1 , 2 b ] [1,2b] [1,2b] 且为 A 的倍数。
C C C:确定 B B B 后,因为 C C C 必须满足为 B B B 的倍数,所以只要让 C C C 变成距离 c c c 近的 B B 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;
}