比赛链接:Here

1311A. Add Odd or Subtract Even

签到题,

  • Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图1 时必须做做减法,如果差值为偶数的话只需要 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图2 次不然做一次减法后再做一次 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图3 即可
  • Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图4 同理了
  • Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图5 0次
  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int _; for (cin >> _; _--;) {
  4. ll a, b;
  5. cin >> a >> b;
  6. if (a == b) cout << "0\n";
  7. else if (a > b) {
  8. if ((a - b) & 1) cout << "2\n";
  9. else cout << "1\n";
  10. } else {
  11. if ((a - b) & 1) cout << "1\n";
  12. else cout << "2\n";
  13. }
  14. }
  15. }

1311B. WeirdSort

题意:给出长度为 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图6 的数组以及长度为 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图7 的允许进行 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图8#card=math&code=swap%28a%5Bi%5D%2Ca%5Bi%20%2B%201%5D%29) 的下标,

问经过若干次之后是否能使得数组有序

思路:

注意到 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图9 那么我可以直接跑若干次循环对于 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图10 的地方交换 (前提是允许交换),

如果最后有序了就输出 YES

  1. const int N = 110;
  2. int a[N], st[N];
  3. int main() {
  4. cin.tie(nullptr)->sync_with_stdio(false);
  5. int _; for (cin >> _; _--;) {
  6. int n, m;
  7. cin >> n >> m;
  8. for (int i = 1; i <= n; ++i) cin >> a[i];
  9. memset(st, 0, sizeof(st));
  10. for (int i = 1, x; i <= m; ++i) cin >> x, st[x] = 1;
  11. for (int i = 0; i < n; ++i)
  12. for (int j = 1; j < n; ++j)
  13. if (a[j] > a[j + 1] and st[j]) swap(a[j], a[j + 1]);
  14. bool f = 1;
  15. for (int i = 1; i < n and f; ++i) if (a[i] > a[i + 1]) f = 0;
  16. cout << (f ? "YES\n" : "NO\n");
  17. }
  18. }

1311C. Perform the Combo

题意:给一个长度为n的字符串 会犯m个错误 每次犯错误就要重新输入

问你所有字母共打了多少次?

思路

似乎很多人用前缀和写的,

我的思路是在某个位置去二分找是否有若干次在它之后会出错的次数并累计即可。

  1. int cnt[300];
  2. int main() {
  3. cin.tie(nullptr)->sync_with_stdio(false);
  4. int _; for (cin >> _; _--;) {
  5. memset(cnt, 0, sizeof(cnt));
  6. int n, m;
  7. string s;
  8. cin >> n >> m >> s;
  9. vector<int>p;
  10. for (int i = 0, x; i < m; ++i) {
  11. cin >> x;
  12. p.emplace_back(x);
  13. }
  14. sort(p.begin(), p.end());
  15. for (int i = 0; i < n; ++i) {
  16. int t = p.end() - lower_bound(p.begin(), p.end(), i + 1);
  17. cnt[s[i]] += 1 + t;
  18. // cout << s[i] << ": " << t << "\n";
  19. }
  20. for (auto c = 'a'; c <= 'z'; ++c) cout << cnt[c] << " ";
  21. cout << "\n";
  22. }
  23. }

1311D. Three Integers

题意:

给了Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图11 三个数,现在你可以对任意一个数进行任意次数的 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图12Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图13 问你最少操作次数让Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图14

思路:

Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图15 改变的最大范围也就是 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图16,直接枚举就可以,但是 Codeforces Round #624 (Div. 3) (A~D,CD Good) - 图17 明显是会超时的。这里稍微优化一下。

  1. int main() {
  2. cin.tie(nullptr)->sync_with_stdio(false);
  3. int _; for (cin >> _; _--;) {
  4. int a, b, c;
  5. cin >> a >> b >> c;
  6. int aa = a, bb = b, cc = c;
  7. int cnt = INT_MAX;
  8. for (int i = 1; i <= 11000; ++i)
  9. for (int j = 1; i * j <= 11000; ++j)
  10. for (int k = 1; i * j * k <= 11000; ++k) {
  11. if (cnt > abs(i - a) + abs(i * j - b) + abs(i * j * k - c)) {
  12. cnt = abs(i - a) + abs(i * j - b) + abs(i * j * k - c);
  13. aa = i, bb = i * j, cc = i * j * k;
  14. }
  15. }
  16. cout << cnt << "\n" << aa << " " << bb << " " << cc << "\n";
  17. }
  18. }