比赛链接:https://atcoder.jp/contests/abc168/tasks
A - ∴ (Therefore)
题意
给出一个由数字组成的字符串 $s$,要求如下:
- 如果 $s$ 以 2,4,5,7,9 结尾,输出 "hon"
- 如果 $s$ 以 0,1,6,8 结尾,输出 "pon"
- 如果 $s$ 以 3 结尾,输出 "bon"
代码
#include <bits/stdc++.h> using namespace std; int main() { map<char, string> mp; mp['2'] = mp['4'] = mp['5'] = mp['7'] = mp['9'] = "hon"; mp['0'] = mp['1'] = mp['6'] = mp['8'] = "pon"; mp['3'] = "bon"; string s; cin >> s; cout << mp[s.back()]; }
B - ... (Triple Dots)
题意
给出正整数 $n$ 和字符串 $s$,如果字符串长度大于 $n$,输出前 $n$ 个字符和 "...",否则输出原字符串。
代码
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; string s; cin >> s; cout << s.substr(0, n) << (s.size() > n ? "..." : ""); }
C - : (Colon)
题意
已知钟表上时针分针的长度,输出某时刻二者末端的距离。
题解
余弦定理。
代码
#include <bits/stdc++.h> #define PI acos(-1) using namespace std; int main() { double a, b, h, m; cin >> a >> b >> h >> m; double a1 = abs(5.0 * (h + m / 60.0) - m); double a2 = 60.0 - a1; double a3 = 2.0 * PI * min(a1, a2) / 60.0; printf("%.9f", sqrt(a * a + b * b - 2 * a * b * cos(a3))); }
D - .. (Double Dots)
题意
给出一个图,在每个端点处树立一个指向牌,使得从每个端点出发沿指向牌走到端点 $1$ 的路程最短。
题解
最短路问题,bfs 就好了。
代码
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 100; vector<int> e[N]; bool vis[N]; int fa[N]; void bfs() { queue<int> que; que.push(1); vis[1] = true; while (!que.empty()) { int u = que.front(); que.pop(); for (auto v : e[u]) { if (!vis[v]) { fa[v] = u; que.push(v); vis[v] = true; } } } } int main() { int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } bfs(); for (int i = 2; i <= n; i++) { if (fa[i] == 0) { cout << "No"; return 0; } } cout << "Yes" << "\n"; for (int i = 2; i <= n; i++) { cout << fa[i] << "\n"; } }