Codeforces Round 880 (Div. 2) 题解 A - C

写在前面

感觉题目是一坨。

A愣了一会,BC同开然后半天读不懂题。写出来发现毛算法都没有,div1那边更是大寄。DEF三题过题数个位数根本看都看不来。总结为很烂的一场。

A. Destroyer

题目大意

每个机器人可以显示他前面有多少机器人,现在给定这些机器人的显示序列,问他们能否以某种排列使得所有显示合法。

解题思路

我们需要知道显示的数少的机器人数一定不能少于显示的数多的机器人数,那么我们只需要判断每一种数有多少个即可。

我在这里判断了一下是否出现跳步,实际上是个剪枝,可以省略。

AC Code

#include <iostream>
#include <algorithm>
#include <cstring>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;
typedef long long LL;

const int N = 4e5 + 10;
const int MOD = 1e9 + 7;

void solve() {
    int n;
    cin >> n;
    int a[150] = {0};
    int max_ = -1;
    for (int i = 1; i <= n; ++i) {
        int x;
        cin >> x;
        max_ = max(max_, x);
        a[x]++;
    }
    for (int i = 0; i <= max_; ++i) {
        if (!a[i]) {
            cout << "NO" << endl;
            return;
        } else if (i && a[i] > a[i - 1]) {
            cout << "NO" << endl;
            return;
        }
    }
    cout << "YES" << endl;
}

signed main() {
    ios;
    int T = 1;
    cin >> T;
    while (T--) {
        solve();
    }
}

B. Astrophysicists

题目大意

需要将 \(k\times g\) 个银币分给 \(n\) 个人,采取四舍五入分配,我们需要确定四舍五入的基准值,来使得节省的钱最多。

解题思路

感觉主要是模拟过程吧,一定要按照题目给出的取模方式四舍五入,用ceil和round的话会被卡精度,因为精度问题WA掉两发。

AC Code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;
typedef long long LL;

const int N = 4e5 + 10;
const int MOD = 1e9 + 7;

void solve() {
    int a, b, c;
    LL res = 0;
    cin >> a >> b >> c;
    int t = b * c;
    int k = c / 2 + (c % 2);
    int t2 = (k - 1) * a;
    if (t2 >= t) {
        res = t;
    } else {
        res = b * c - c * ((t - t2) / (c) + ((t - t2) % (c) > 0));
        res = max(res, 0ll);
    }
    cout << res << endl;
}

signed main() {
    ios;
    int T = 1;
    cin >> T;
    while (T--) {
        solve();
    }
}

C. k-th equality

题目大意

找到一个 \(a\) 位数,一个 \(b\) 位数加起来等于一个 \(c\) 位数的等式集合,再输出字典序第 \(k\) 个的等式。

解题思路

暴力枚举 \(A\),我们类似计数类dp那样去找,在 \(A\) 确定的情况下有多少种 \(B\)\(C\) 的组合可以使得满足题目条件,随后不断压缩 \(k\) 找到第 \(k\) 个。

AC Code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;
typedef long long LL;

const int N = 4e5 + 10;
const int MOD = 1e9 + 7;

void solve() {
    LL a, b, c, k;
    cin >> a >> b >> c >> k;
    LL xx = 1, yy = 1, zz = 1;
    while (--a) {xx *= 10;}
    while (--b) {yy *= 10;}
    while (--c) {zz *= 10;}
    for (int i = xx; i < xx * 10; ++i) {
        LL x = max(yy, zz - i);
        LL y = min(yy * 10, zz * 10 - i);
        if (x > y) continue;
        if (y - x >= k) {
            cout << i << " + " << x + k - 1 << " = " << i + k - 1 + x << endl;
            return;
        }
        k -= y - x;
    }
    cout << -1 << endl;
}

signed main() {
    ios;
    int T = 1;
    cin >> T;
    while (T--) {
        solve();
    }
}
posted @ 2023-06-19 00:56  叁纔  阅读(128)  评论(0编辑  收藏  举报