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\n"; for (int i = 0; i < n; i++) cout << ans[i] << "\n"; 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"; }