昨晚打了一场CF 来补一个D题 https://codeforces.com/contest/1311/problem/D
原来是个暴力
t组数据 输入 a b c
然后求一组 A B C 使得abs(A-a)+abs(B-b) + abs(C-c)最小
做法就是拿set存储每一个可以整除它的数,直接暴力,
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e4+5;
set<int>s[maxn];
int main()
{
for(int i=1;i<=20000;i++)//存因子
{
for(int j=1;j*j<=i;j++)
{
if(i%j==0)
{
s[i].insert(j);
s[i].insert(i/j);
}
}
}
int t,a,b,c,l,r,ans,n1,n2,n3,a0,b0,c0;
cin>>t;
while(t--)
{
n1=n2=n3=0;
ans=3*maxn;
scanf("%d %d %d",&a,&b,&c);
// l=max(1,c-b);//缩小c的可能范围(不缩小暴力1~2e4也行)
// r=c+b;
for(int i=1;i<=20000;i++)
{
n3=abs(c-i);//c移动次数
for(auto it=s[i].begin();it!=s[i].end();it++)
{
n2=abs(b-*it);//b移动次数
for(auto iit=s[*it].begin();iit!=s[*it].end();iit++)
{
n1=abs(a-*iit);//a移动次数
if(n1+n2+n3<ans)
{
ans=n1+n2+n3;
a0=*iit;
b0=*it;
c0=i;
}
}
}
}
cout<<ans<<endl;
printf("%d %d %d\n",a0,b0,c0);
}
return 0;
}