AtCoder Regular Contest 123 (A~C 三道好题)

比赛链接:Here

A - Arithmetic Sequence (good)

注意细节

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    ll a, b, c;
    cin >> a >> b >> c;
    ll x = 2 * b - a - c;
    ll k = (x >= 0 ? 0 : (1 - x) / 2);
    ll ans = x + 3 * k;
    cout << ans << endl;
}

B - Increasing Triples (good)

大根堆优先队列

using PQ = priority_queue<int, vector<int>, greater<int>>;

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;
    cin >> n;

    PQ A, B, C;
    for (int i = 0, x; i < n; ++i) {cin >> x; A.push(x);}
    for (int i = 0, x; i < n; ++i) {cin >> x; B.push(x);}
    for (int i = 0, x; i < n; ++i) {cin >> x; C.push(x);}

    int a, b;
    int ans = 0;
    while (!A.empty()) {
        a = A.top(); A.pop();

        while (!B.empty() and B.top() <= a)B.pop();
        if (B.empty() )break;
        b = B.top(); B.pop();

        while (!C.empty() and C.top() <= b)C.pop();
        if (C.empty()) break;
        C.pop();

        ++ans;
    }
    cout << ans ;
}

C - 1, 2, 3 - Decomposition (good)

给你一个数,让你分解成不含0的四进制之和,求最少分解成多少个?


从高位到低位思考,每一位有两种情况,一种借一给低位,另一种不借。含高位构造数数目小于等于含低位的构造数数目.

int solve(ll n) {
    if (n == 0)return 0;
    if (n < 10)return (n - 1) / 3 + 1;
    ll mi = 0;
    ll pi = n, pa, pb;
    pb = solve(pi / 10 - 1);
    pa = solve(pi / 10);
    if (pa > pi % 10)return max(pb, (pi % 10 + 10 - 1) / 3 + 1);
    return min(max(pa, (pi % 10 - 1) / 3 + 1), max(pb, (pi % 10 + 10 - 1) / 3 + 1));
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int _; for (cin >> _; _--;) {
        ll n; cin >> n;
        cout << solve(n) << '\n';
    }
}
posted @ 2021-07-20 16:47  RioTian  阅读(136)  评论(1编辑  收藏  举报