码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #624 (Div. 3) D 题

时间:2020-02-25 18:12:59      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:链接   ORC   math   char   最小   范围   test   abs   class   

题目链接: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 \times 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 题

标签:链接   ORC   math   char   最小   范围   test   abs   class   

原文地址:https://www.cnblogs.com/chz-hc/p/12362564.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!