SMU Autumn 2024 Personal Round 1
SMU Autumn 2024 Personal Round 1
前言
拉了,后面有空再补补。
A. Lex String
思路
排序后取最小,记录连续取了几个,不要超过 \(k\) 个即可。
代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
void solve() {
int n, m, k;
cin >> n >> m >> k;
string a, b;
cin >> a >> b;
sort(a.begin(), a.end(), greater<>());
sort(b.begin(), b.end(), greater<>());
string c = "";
int o = 0, p = 0;
while (n && m) {
if (a[n - 1] < b[m - 1] && o < k || p >= k) {
c += a[n - 1];
n --, o ++;
p = 0;
} else {
c += b[m - 1];
m --, p ++;
o = 0;
}
}
cout << c << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
B - Creep
思路
前面用01
或者10
串填满,后面放剩下的。
代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
void solve() {
int a[2];
cin >> a[0] >> a[1];
int n = a[0] + a[1] , k = a[0] > a[1] ? 0 : 1;
string s = "01";
for (int i = 0; i < n; i ++) {
if (a[0] && a[1]) {
cout << s[k];
a[k] --;
k ^= 1;
} else {
cout << s[k];
}
}
cout << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
C. Mystic Permutation
思路
数据小,直接暴搜即可。
代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
void solve() {
int n;
cin >> n;
vector<int> p(n + 1);
for (int i = 1; i <= n; i ++) {
cin >> p[i];
}
bool ok = 0;
vector<int> ans(n + 1), vis(n + 1);
auto dfs = [&](auto && self, int pos)->void{
if (ok) return;
if (pos == n + 1) {
ok = 1;
for (int i = 1; i <= n; i ++) {
cout << ans[i] << " \n"[i == n];
}
return ;
}
for (int i = 1; i <= n; i ++) {
if (ok) break;
if (i != p[pos] && !vis[i]) {
ans[pos] = i;
vis[i] = 1;
self(self, pos + 1);
vis[i] = 0;
}
}
};
dfs(dfs, 1);
if (!ok)
cout << "-1\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}