补题链接:Here

A - Div

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

水题,写几组情况就能知道输出 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图1 即可

B - Palindrome with leading zeros

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

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

C - Compass Walking

题意:在一个二维坐标轴上,给定一个长度 R ,请问是否有最小步数(每步只能走 R,但坐标可以非整数)到达 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图2#card=math&code=%28X%2CY%29)

思路:

假设 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图3 为 起点AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图4#card=math&code=%280%2C0%29) 至 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图5#card=math&code=%28X%2CY%29) 的欧几里得距离,则容易想到以下三种情况

  • 答案为 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图6 ,如果 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图7
  • 答案为 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图8 ,如果 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图9 并且 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图10
  • AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图11 ,其他情况

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

  1. void solve() {
  2. double R, X, Y;
  3. cin >> R >> X >> Y;
  4. double d = sqrt(X * X + Y * Y);
  5. if (d < R) cout << 2;
  6. else
  7. cout << ceil(d / R);
  8. }

D - Send More Money

题意:给定 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图12 个字符串 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图13 试问是否有数字能代替某种字母使得 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图14

思路:

首先,如果出现 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图15 种以上的字母,那么肯定是无法解决的,直接输出 UNSOLVABLE 即可

对于剩下的情况来说,可以尝试把数字分配给字母,然后 check 一下 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图16

AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图17 是可执行范围内

注意别给首位分配 AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维 全排列,E题DFS搜索,F懵逼) - 图18 即可

  1. void solve() {
  2. map<char, int> ch;
  3. string s, t, w;
  4. cin >> s >> t >> w;
  5. for (char c : s) ch.emplace(c, 0);
  6. for (char c : t) ch.emplace(c, 0);
  7. for (char c : w) ch.emplace(c, 0);
  8. if (ch.size() > 10) {
  9. cout << "UNSOLVABLE";
  10. return;
  11. }
  12. int p[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  13. do {
  14. string a, b, c;
  15. int i = 0;
  16. for (auto it = ch.begin(); it != ch.end(); ++it, i++)
  17. it->second = p[i];
  18. for (char x : s) a.push_back(ch[x] + '0');
  19. for (char x : t) b.push_back(ch[x] + '0');
  20. for (char x : w) c.push_back(ch[x] + '0');
  21. ll A = stoll(a), B = stoll(b), C = stoll(c);
  22. if (a[0] != '0' && b[0] != '0' && c[0] != '0' && A + B == C) {
  23. cout << a << "\n"
  24. << b << "\n"
  25. << c << "\n";
  26. return;
  27. }
  28. } while (next_permutation(p, p + 10));
  29. cout << "UNSOLVABLE";
  30. }

E - Unique Color

题意:

思路:用 DFS 搜索一下即可

  1. // Murabito-B 21/04/12
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. using ll = long long;
  5. const int N = 100005;
  6. int n, c[N], cnt[N], good[N];
  7. vector<int> to[N];
  8. void dfs(int u, int fa) {
  9. if (cnt[c[u]] == 0) good[u] = 1;
  10. cnt[c[u]]++;
  11. for (int i = 0, v; i < to[u].size(); i++)
  12. if ((v = to[u][i]) != fa) dfs(v, u);
  13. cnt[c[u]]--;
  14. }
  15. void solve() {
  16. cin >> n;
  17. for (int i = 1; i <= n; ++i) cin >> c[i];
  18. for (int i = 1, u, v; i < n; ++i) cin >> u >> v, to[u].push_back(v), to[v].push_back(u);
  19. dfs(1, 0);
  20. for (int i = 1; i <= n; ++i)
  21. if (good[i]) cout << i << "\n";
  22. }
  23. int main() {
  24. ios_base::sync_with_stdio(false), cin.tie(0);
  25. solve();
  26. return 0;
  27. }

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