补题链接:Here
1497A. Meximization
简单构造。
题目中让找出MEX最小最大的值,根据提示能发现当MEX子集按顺序排列时它的每一步的MEX都会是最大的,所以只需要将输入的数组排序先输出不重复的数,再把剩下的一次全部输出。
void solve() {int n; cin >> n;int a[n + 1];for (int i = 1; i <= n; ++i)cin >> a[i];sort(a + 1, a + 1 + n);a[0] = -1;for (int i = 1; i <= n; ++i)if (a[i] != a[i - 1])cout << a[i] << " ";for (int i = 1; i <= n; ++i)if (a[i] == a[i - 1])cout << a[i] << " ";cout << '\n';}
1497B. M-arrays
给定n个数,问你按照要求最少分成几个数组;要求:要么数组中只有一个数,要么数组中的相邻的两个数两两加和能被m整除。
这个题利用余数做,把除m后余数为x的和余数m-x的放到一个数组中,然后把多余的单独放到一个数组中即可。
void solve() {int n, m;ll sum = 0;cin >> n >> m;int a[m + 1] = {0};for (int i = 1, x; i <= n; ++i)cin >> x, a[x % m]++;if (a[0] != 0)sum++;for (int i = 1; i <= m / 2; ++i)if (a[i] != 0 and a[i] == a[m - i])sum++;else sum += abs(a[i] - a[m - i]);cout << sum << "\n";}
1497C2. k-LCM (hard version)
#include <bits/stdc++.h>using namespace std;using ll = long long;// LCM 最小公倍数vector<int> solve3(int n) {if (n % 2 == 1) return {vector<int>{1, n / 2, n / 2}};if (n % 4 == 0) return {vector<int>{n / 2, n / 4, n / 4}};if (n % 2 == 0) return {vector<int>{2, n / 2 - 1, n / 2 - 1}};}int main() {ios_base::sync_with_stdio(false), cin.tie(0);int _ = 1;for (cin >> _; _--;) {ll n, k;cin >> n >> k;vector<int> added = solve3(n - k + 3);for (int i = 0; i < k; ++i) {cout << (i < 3 ? added[i] : 1) << ' '; // <3}cout << '\n';}return 0;}
