Codeforces Round #624 (Div. 3) D - Three Integers(枚举技巧)

题目链接


题目大意

给出三个数 a ≤ b ≤ c a \leq b \leq c abc,现在每次可以将一个数 + 1 +1 +1或者 − 1 -1 1,每次移动步数加一,但不能减到小于等于 0 0 0。现在求若移动到 c % b = = 0    & &    b % a = = 0 c\%b==0 ~~\&\& ~~b\%a==0 c%b==0  &&  b%a==0最小的移动总步数

解题思路

我们知道,整除关系也是倍数关系,那么我们在素筛那里是如何处理每个确定是素数的倍数呢?每次加上这个数的大小!那么这时我们发现可以一个三重循环,第一层 i i i暴力到数的最大范围,第二层 j j j每次增加 i i i,第三层 k k k每次增加 j j j,这样保证了整除关系的三个数的枚举,再维护一个最小值即可。注意数的范围要比10000大一些,第一次10010却WA了,第二次11000就过了

代码:

#include <iostream>
#include <math.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=11000;

int a,b,c,t;
int main()
{
    int x,y,z,ans,res;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&x,&y,&z);
        ans=INF;
        for(int i=1;i<=maxn;i++)
            for(int j=i;j<=maxn;j+=i)
                for(int k=j;k<=maxn;k+=j){
                    res=abs(i-x)+abs(j-y)+abs(k-z);
                    if(res<ans){
                        ans=res;
                        a=i,b=j,c=k;
                    }
                }
        printf("%d\n",ans);
        printf("%d %d %d\n",a,b,c);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值