补题链接: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;
}