Codeforces Round #624 (Div. 3) D 题

Posted chz-hc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #624 (Div. 3) D 题相关的知识,希望对你有一定的参考价值。

题目链接:Three Integers

简要题意:

给出 (a, b, c) 满足 (a leq b leq c)

你可以随便选择其中一个数,使这个数 (+1)(-1)

假设最后操作完 (a)(A)(b)(B)(c)(C)

你需要使 (A | B)(B | C),并最小化操作次数。

输出操作次数和 (A, B, C)

多组数据。

数据范围:(1 leq t leq 100)(1 leq a, b, c leq 10 ^ 4)

做法

考虑到最后的 (A, B, C) 一定满足 ((a1 cdot A = B)(a2 cdot B = C)) 其中 (a1, a2 geq 1) 且为整数。

根据 (a1 cdot A = B)(a2 cdot B = C) 可得 (C = a1 cdot ca2 cdot A)

故我们只需枚举 (A, a1, a2) 然后求出 (A, B, C) 并与 (a, b, c) 比较取最小值即可。

考虑到 (1 leq a, b, c leq 10 ^ 4),可知 (A, B, C leq 3 imes 4000)

故枚举不会超时。

Code:

#include <bits/stdc++.h>
 
#define ll long long
#define rep(i, l, r) for (int i = l; i <= r; ++ i)
 
using namespace std;
 
inline int read() {
    int cnt = 0, opt = 1; char ch = getchar();
 
    for (; ! isdigit(ch); ch = getchar()) 
        if (ch == '-')  opt = 0;
    for (; isdigit(ch); ch = getchar()) 
        cnt = (cnt << 1) + (cnt << 3) + (ch ^ 48);
 
    return opt ? cnt : -cnt;
}
 
int T;  
 
int main() {
    T = read();
    while (T --) {
        long long a, b, c, a1, a2, a3;
        long long ans = (1ll << 60);
        a = read(), b = read(), c = read();
        rep (i, 1, 12000)
            rep (j, 1, 12000 / i + 1)
                rep (k, 1, 12000 / (i * j) + 2)
                    if (ans > abs(i - a) + abs(1ll * i * j - b) + abs(1ll * i * j * k - c))
                        ans = abs(i - a) + abs(1ll * i * j - b) + abs(1ll * i * j * k - c), 
                         a1 = i, a2 = i * j, a3 = i * j * k;
 
            cout << ans << endl << a1 << ' ' << a2 << ' ' << a3 << endl;
    }
    return 0;
}

以上是关于Codeforces Round #624 (Div. 3) D 题的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #624 (Div. 3) B. WeirdSort(排序)

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

Codeforces Round #624 (Div. 3) D 题

Codeforces Round #624 F. Moving Points 离散化 + 树状数组

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)