AtCoder Beginner Contest 166

比赛链接:https://atcoder.jp/contests/abc166/tasks

A - A?C

题意

AtCoder 会轮流举行 ABC,ARC 两种类型的比赛,已知上一次举行的比赛类型,问这一次会举行哪一种比赛。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s; cin >> s;
    cout << (s == "ABC" ? "ARC" : "ABC");
}

B - Trick or Treat

题意

有 $n$ 个人,$k$ 种小吃,每种小吃有 $d_i$ 个人拥有,找出有多少人一个小吃也没有。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, k; cin >> n >> k;
    int cnt[105] = {};
    for (int i = 0; i < k; i++) {
        int d; cin >> d;
        for (int j = 0; j < d; j++) {
            int x; cin >> x;
            ++cnt[x];
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; i++) ans += cnt[i] == 0;
    cout << ans;
}

C - Peaks

题意

有 $n$ 个天文台和 $m$ 条路,每个天文台有一个所在的海拔高度,如果一个天文台所在的海拔高度比和它相邻的所有天文台高,我们称之为一个好天文台,如果一个天文台不与其他天文台相邻,我们也称之为一个好天文台,求出好天文台的总数。

题解

因为只考虑相邻的天文台,所以从每个点出发遍历即可。

因为每条边会被遍历两遍,所以复杂度是 $O_{(2m)}$ 。

代码

#include <bits/stdc++.h>
using namespace std;

const int M = 2e5 + 100;
int h[M];
vector<int> e[M];

int bfs(int u) {
    for (int v : e[u])
        if (h[v] >= h[u]) return 0;
    return 1;
}

int main() {
    int n, m; cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> h[i];
    for (int i = 0; i < m; i++) {
        int u, v; cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    int ans = 0;
    for (int i = 1; i <= n; i++) ans += bfs(i);
    cout << ans;
}

D - I hate Factorization

题意

给出 $x$,找出满足 $a^5-b^5=x$ 的 $a$ 和 $b$ 。

题解

移项得:$a^5=x+b^5$,所以可以枚举 $b^5$,判断 $x+b^5$ 是否也为某一个数的 $5$ 次方即可。

代码

#include <bits/stdc++.h>
using LL = long long;
using namespace std;
map<LL, LL> mp;
set<LL> st;
int main() {
    for (LL i = -1000; i <= 1000; i++) {
        LL x = i * i * i * i * i;
        st.insert(x);
        mp[x] = i;
    }
    LL x; cin >> x;
    for (auto b : st) {
        if (st.find(x + b) != st.end()) {
            cout << mp[x + b] << ' ' << mp[b];
            return 0;
        }
    }
}

E - This Message Will Self-Destruct in 5s

题意

找出数组 $a$ 中有多少对 $j-i=a_j+a_i (j>i)$。

题解

移项得:$j-a_j=i+a_i$,即只需记录 $i+a_i$ 的个数,对于之后的每个 $j-a_j$ 加上之前出现过的 $i+a_i$ 的个数即可。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; cin >> n;
    map<int, int> mp;
    long long ans = 0;
    for (int i = 1; i <= n; i++) {
        int x; cin >> x;
        ans += mp[i - x];
        ++mp[i + x];
    }
    cout << ans;
}

F - Three Variables Game

题意

开始时有 $a,b,c$ 三个数,接下来有 $n$ 个操作,每个操作给出 $a,b,c$ 中的两个变量,可以选择给其中一个 +1,另一个 -1,问能否在 $n$ 个操作的过程中 $a,b,c$ 均能保持为非负数,输出方案。

题解

先贴一份DFS的代码(能过好像是因为反例较少)。

代码

#include <bits/stdc++.h>
using namespace std;

const int M = 1e5 + 100;
int n, a, b, c;
string s[M];
char ans[M];

void dfs(int i, int a, int b, int c) {
    if (i == n) {
        cout << "Yes
";
        for (int i = 0; i < n; i++) cout << ans[i] << "
";
        exit(0);
    }
    if (s[i] == "AB") {
        if (a) ans[i] = 'B', dfs(i + 1, a - 1, b + 1, c);
        if (b) ans[i] = 'A', dfs(i + 1, a + 1, b - 1, c);
    }
    if (s[i] == "BC") {
        if (b) ans[i] = 'C', dfs(i + 1, a, b - 1, c + 1);
        if (c) ans[i] = 'B', dfs(i + 1, a, b + 1, c - 1);
    }
    if (s[i] == "AC"){
        if (a) ans[i] = 'C', dfs(i + 1, a - 1, b, c + 1);
        if (c) ans[i] = 'A', dfs(i + 1, a + 1, b, c - 1);
    }
}

int main() {
    cin >> n >> a >> b >> c;
    for (int i = 0; i < n; i++) cin >> s[i];
    dfs(0, a, b, c);
    cout << "No";
}
原文地址:https://www.cnblogs.com/Kanoon/p/12823787.html