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;
}