补题链接:Here

1497A. Meximization

简单构造。

题目中让找出MEX最小最大的值,根据提示能发现当MEX子集按顺序排列时它的每一步的MEX都会是最大的,所以只需要将输入的数组排序先输出不重复的数,再把剩下的一次全部输出。

  1. void solve() {
  2. int n; cin >> n;
  3. int a[n + 1];
  4. for (int i = 1; i <= n; ++i)cin >> a[i];
  5. sort(a + 1, a + 1 + n);
  6. a[0] = -1;
  7. for (int i = 1; i <= n; ++i)
  8. if (a[i] != a[i - 1])cout << a[i] << " ";
  9. for (int i = 1; i <= n; ++i)
  10. if (a[i] == a[i - 1])cout << a[i] << " ";
  11. cout << '\n';
  12. }

1497B. M-arrays

给定n个数,问你按照要求最少分成几个数组;要求:要么数组中只有一个数,要么数组中的相邻的两个数两两加和能被m整除。

这个题利用余数做,把除m后余数为x的和余数m-x的放到一个数组中,然后把多余的单独放到一个数组中即可。

  1. void solve() {
  2. int n, m;
  3. ll sum = 0;
  4. cin >> n >> m;
  5. int a[m + 1] = {0};
  6. for (int i = 1, x; i <= n; ++i)cin >> x, a[x % m]++;
  7. if (a[0] != 0)sum++;
  8. for (int i = 1; i <= m / 2; ++i)
  9. if (a[i] != 0 and a[i] == a[m - i])sum++;
  10. else sum += abs(a[i] - a[m - i]);
  11. cout << sum << "\n";
  12. }

1497C2. k-LCM (hard version)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. // LCM 最小公倍数
  5. vector<int> solve3(int n) {
  6. if (n % 2 == 1) return {vector<int>{1, n / 2, n / 2}};
  7. if (n % 4 == 0) return {vector<int>{n / 2, n / 4, n / 4}};
  8. if (n % 2 == 0) return {vector<int>{2, n / 2 - 1, n / 2 - 1}};
  9. }
  10. int main() {
  11. ios_base::sync_with_stdio(false), cin.tie(0);
  12. int _ = 1;
  13. for (cin >> _; _--;) {
  14. ll n, k;
  15. cin >> n >> k;
  16. vector<int> added = solve3(n - k + 3);
  17. for (int i = 0; i < k; ++i) {
  18. cout << (i < 3 ? added[i] : 1) << ' '; // <3
  19. }
  20. cout << '\n';
  21. }
  22. return 0;
  23. }