Codeforces Round #730 (Div. 2) A~D题个人题解

比赛链接:Here

1543A. Exciting Bets

math,

给定两个数字 \(a,b (a,b \le 1e18)\) 和以下两种操作:

  • \(a + 1,b+1\)
  • \(a-1,b-1\ if\ a > 0\) 并且 $ b > 0$

请问经过最少多少次操作能使得 \(GCD(a,b)\) 最大化

注意:\(GCD(x,0)=x\)

输出 \(max(GCD(a,b)),min(cnt)\)


  • 如果 \(a = b\) 那么直接输出 \(0,0\)
  • 否则,能获得的最大 \(GCD(a,b) = |a-b|\) ,对于实现次数为 \(min(a\ mod\ g,g - a\ mod\ g)\)

【AC Code】

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int _; for (cin >> _; _--;) {
        ll a, b;
        cin >> a >> b;
        if (a == b)cout << "0 0\n";
        else {
            ll g = abs(a - b);
            ll m = min(a % g, g - a % g);
            cout << g << " " << m << "\n";
        }
    }
}

1543B. Customising the Track

给定数组 \(a\) ,给定以下操作:

可以把任意值的 \(a_i\) 转移给 \(a_j\)

求最小化 \(\sum\limits_{i = 1}^n\sum\limits_{j = i + 1}^n|a_i-a_j|\)


要最小化 \(\sum\limits_{i = 1}^n\sum\limits_{j = i + 1}^n|a_i-a_j|\) ,简单贪 \(a_i = a_j\)

如果 数组数值总和不能平均分配则把不能平均分配的数都化 1

【AC Code】

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int _; for (cin >> _; _--;) {
        int n; cin >> n;
        ll sum = 0;
        for (int i = 0; i < n; ++i) {
            ll x; cin >> x;
            sum += x;
        }
        ll t = sum / n, tt = sum % n;
        cout << sum % n * (n - (sum - t * n)) << "\n";
    }
}

1543C. Need for Pink Slips

(题意太长,翻译不过来)


精度!精度!还是精度!

能用long double就不用 double

【AC Code】

using ld = long double;

const ld eps = 1e-9;
const ld scale = 1e+6;

ld solve(int c, int m, int p, int v) {
    ld ans = p / scale;
    if (c > 0) {
        if (c > v) {
            if (m > 0) ans += (c / scale) * (1 + solve(c - v, m + v / 2, p + v / 2, v));
            else ans += (c / scale) * (1 + solve(c - v, 0, p + v, v));
        } else {
            if (m > 0) ans += (c / scale) * (1 + solve(0, m + c / 2, p + c / 2, v));
            else ans += (c / scale) * (1 + solve(0, 0, p + c, v));
        }
    }

    if (m > 0) {
        if (m > v) {
            if (c > 0) ans += (m / scale) * (1 + solve(c + v / 2, m - v, p + v / 2, v));
            else ans += (m / scale) * (1 + solve(0, m - v, p + v, v));
        } else {
            if ( c > 0) ans += (m / scale) * (1 + solve(c + m / 2, 0, p + m / 2, v));
            else ans += (m / scale) * (1 + solve(0, 0, p + m, v));
        }
    }
    return ans;
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int _; for (cin >> _; _--;) {
        ld cd, md, pd, vd;
        cin >> cd >> md >> pd >> vd;
        int c = round(cd * scale);
        int m = round(md * scale);
        int p = round(pd * scale);
        int v = round(vd * scale);
        ld ans = solve(c, m, p, v);
        cout << setprecision(12) << fixed << ans << "\n";
    }
}

1543D1. RPD and Rap Sheet (Easy Version)

(说实话,没看懂这题;

赛后学习一下 Pecco神 的代码

【AC Code】

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int _; for (cin >> _; _--;) {
        int n, x, s = 0;
        cin >> n >> x;
        for (int i = 0; i < n; ++i) {
            int y = (i ^ s), ok;
            cout << y << "\n"
                 << flush;
            cin >> ok;
            if (ok) break;
            s ^= y;
        }
    }
}
posted @ 2021-07-08 16:17  RioTian  阅读(157)  评论(0编辑  收藏  举报