D. Three Integers
题目链接-D. Three Integers
题目大意
给了 a、b、c 三个数,现在你可以对任意一个数进行任意次数的 +1和−1操作,求最少操作次数使得b%a=0,c%b=0
解题思路
暴力枚举+剪枝,三重循环即可,不剪枝会T
因为A≤B≤C,所以B从 i 开始枚举,C从 j 开始枚举
又因为b%a=0,c%b=0,所以每次循环j+=i,同理k+=j
for(int i=1;i<=11000;i++){//枚举A的值
for(int j=i;j<=11000;j+=i){//枚举B的值
for(int k=j;k<=11000;k+=j)//枚举C的值
坑点:题目没说输出的C也是小于1e4的,很多人都是因为这个被hack,枚举到11000(大佬算出来的极限位置orz)即可
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int a,b,c,A,B,C;
cin>>a>>b>>c;
int minx=INF;
for(int i=1;i<=11000;i++){
for(int j=i;j<=11000;j+=i){
for(int k=j;k<=11000;k+=j){
int tmp=abs(a-i)+abs(b-j)+abs(c-k);
if(tmp<minx){//更新最少操作次数及A B C的值
minx=tmp;
A=i;
B=j;
C=k;
}
}
}
}
cout<<minx<<endl;
cout<<A<<" "<<B<<" "<<C<<endl;
}
return 0;
}