AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维+全排列,E题DFS搜索,F懵逼)...

补题链接:Here

A - Div

题意:N 个不一样的糖,请问有多少种分法给 A,B两人

水题,写几组情况就能知道输出 \(N - 1\) 即可

B - Palindrome with leading zeros

题意:给定一个字符串,问是否可以在字符串前加若干个 0 使字符串回文

先判断一下字符串回文否?本身就回文就无需处理,不然字符串后面有几个 0 就加上多少,然后再判断

C - Compass Walking

题意:在一个二维坐标轴上,给定一个长度 R ,请问是否有最小步数(每步只能走 R,但坐标可以非整数)到达 \((X,Y)\)

思路:

假设 \(d\) 为 起点\((0,0)\)\((X,Y)\) 的欧几里得距离,则容易想到以下三种情况

  • 答案为 \(1\) ,如果 \(d = R\)
  • 答案为 \(2\) ,如果 \(d \ne R\) 并且 \(d < R\)
  • \(\lceil \frac{d}{R} \rceil\) ,其他情况

其实这里 第一种情况和第三种情况可合并写:ceil(d / R)

void solve() {
    double R, X, Y;
    cin >> R >> X >> Y;
    double d = sqrt(X * X + Y * Y);
    if (d < R) cout << 2;
    else
        cout << ceil(d / R);
}

D - Send More Money

题意:给定 \(3\) 个字符串 \(N_1,N_2,N_3\) 试问是否有数字能代替某种字母使得 \(N_1 + N_2 = N_3\)

思路:

首先,如果出现 \(10\) 种以上的字母,那么肯定是无法解决的,直接输出 UNSOLVABLE 即可

对于剩下的情况来说,可以尝试把数字分配给字母,然后 check 一下 \(N_1 + N_2 = N_3\)

\(10 ! = 3628800\) 是可执行范围内

注意别给首位分配 \(0\) 即可

void solve() {
    map<char, int> ch;
    string s, t, w;
    cin >> s >> t >> w;
    for (char c : s) ch.emplace(c, 0);
    for (char c : t) ch.emplace(c, 0);
    for (char c : w) ch.emplace(c, 0);
    if (ch.size() > 10) {
        cout << "UNSOLVABLE";
        return;
    }
    int p[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    do {
        string a, b, c;
        int i = 0;
        for (auto it = ch.begin(); it != ch.end(); ++it, i++)
            it->second = p[i];
        for (char x : s) a.push_back(ch[x] + '0');
        for (char x : t) b.push_back(ch[x] + '0');
        for (char x : w) c.push_back(ch[x] + '0');
        ll A = stoll(a), B = stoll(b), C = stoll(c);
        if (a[0] != '0' && b[0] != '0' && c[0] != '0' && A + B == C) {
            cout << a << "\n"
                 << b << "\n"
                 << c << "\n";
            return;
        }
    } while (next_permutation(p, p + 10));
    cout << "UNSOLVABLE";
}

E - Unique Color

题意:

思路:用 DFS 搜索一下即可

// Murabito-B 21/04/12
#include <bits/stdc++.h>
using namespace std;
using ll    = long long;
const int N = 100005;
int n, c[N], cnt[N], good[N];
vector<int> to[N];
void dfs(int u, int fa) {
    if (cnt[c[u]] == 0) good[u] = 1;
    cnt[c[u]]++;
    for (int i = 0, v; i < to[u].size(); i++)
        if ((v = to[u][i]) != fa) dfs(v, u);
    cnt[c[u]]--;
}
void solve() {
    cin >> n;
    for (int i = 1; i <= n; ++i) cin >> c[i];
    for (int i = 1, u, v; i < n; ++i) cin >> u >> v, to[u].push_back(v), to[v].push_back(u);
    dfs(1, 0);
    for (int i = 1; i <= n; ++i)
        if (good[i]) cout << i << "\n";
}
int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    solve();
    return 0;
}

F题表示是懵逼的,做不来

AtCoder Beginner Contest 134 是一场 AtCoder 的入门级比赛,以下是每道的简要题解: A - Dodecagon 目描述:已知一个正十二边形的边长,求它的面积。 解思路:正十二边形的内角为 $150^\circ$,因此可以将正十二边形拆分为 12 个等腰三角形,通过三角形面积公式计算面积即可。 B - Golden Apple 目描述:有 $N$ 个苹果和 $D$ 个盘子,每个盘子最多可以装下 $2D+1$ 个苹果,求最少需要多少个盘子才能装下所有的苹果。 解思路:每个盘子最多可以装下 $2D+1$ 个苹果,因此可以将苹果平均分配到每个盘子中,可以得到最少需要 $\lceil \frac{N}{2D+1} \rceil$ 个盘子。 C - Exception Handling 目描述:给定一个长度为 $N$ 的整数序列 $a$,求除了第 $i$ 个数以外的最大值。 解思路:可以使用两个变量 $m_1$ 和 $m_2$ 分别记录最大值和次大值。遍历整个序列,当当前数不是第 $i$ 个数时,更新最大值和次大值。因此,最后的结果应该是 $m_1$ 或 $m_2$ 中较小的一个。 D - Preparing Boxes 目描述:有 $N$ 个盒子和 $M$ 个物品,第 $i$ 个盒子可以放入 $a_i$ 个物品,每个物品只能放在一个盒子中。现在需要将所有的物品放入盒子中,每次操作可以将一个盒子内的物品全部取出并分配到其他盒子中,求最少需要多少次操作才能完成任务。 解思路:首先可以计算出所有盒子中物品的总数 $S$,然后判断是否存在一个盒子的物品数量大于 $\lceil \frac{S}{2} \rceil$,如果存在,则无法完成任务。否则,可以用贪心的思想,每次从物品数量最多的盒子中取出一个物品,放入物品数量最少的盒子中。因为每次操作都会使得物品数量最多的盒子的物品数量减少,而物品数量最少的盒子的物品数量不变或增加,因此这种贪心策略可以保证最少需要的操作次数最小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值