Codeforces Round #624 (Div. 3)D. Three Integers

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;
}
发布了78 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104508305