AtCoder Beginner Contest 236
A
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
int a, b;
cin >> s >> a >> b;
swap(s[a - 1], s[b - 1]);
cout << s << endl;
return 0;
}
B
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
int a[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n * 4 - 1; i ++ ) cin >> a[i];
map<int, int> Map;
for (int i = 1; i <= n * 4 - 1; i ++ ) {
Map[a[i]] ++;
}
for (auto x : Map) {
if (x.second != 4)
cout << x.first << endl;
}
return 0;
}
C
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
int n, m;
string s[N], t[N];
int main() {
map<string, int> Map;
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) cin >> s[i];
for (int i = 1; i <= m; i ++ ) cin >> t[i], Map[t[i]] ++;
for (int i = 1; i <= n; i ++ ) {
if (Map.count(s[i])) {
cout << "Yes" << endl;
}
else
cout << "No" << endl;
}
return 0;
}
D
DFS
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 20;
int n, m, ans;
int a[N][N], p[N];
int st[N];
vector<int> color[N];
signed main() {
cin >> n;
m = n * 2;
memset(st, 0, sizeof st);
memset(color, 0, sizeof color);
for (int i = 1; i <= m; i ++ )
for (int j = i + 1; j <= m; j ++ )
cin >> a[i][j];
for (int i = 1; i <= m; i ++ ) st[i] = 2;
function<void(int)> dfs = [&](int d) {
if (d == m + 1) {
int sum = 0;
for (int i = 1; i <= n; i ++ ) {
int x = color[i][0];
int y = color[i][1];
sum ^= a[x][y];
}
ans = max(ans, sum);
return;
}
for (int i = 1; i <= n; i ++ ) {
if (st[i]) {
color[i].push_back(d);
st[i] --;
dfs(d + 1);
color[i].pop_back();
st[i] ++;
}
else
return;
}
};
dfs(1);
cout << ans << endl;
return 0;
}
E
二分答案 + DP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const double eps = 1e-6;
int n;
double a[N];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
scanf("%lf", &a[i]);
{
vector<double> b(n + 1);
function<bool()> check = [&]() {
vector<double> f(2);
f[0] = 0, f[1] = b[1];
for (int i = 2; i <= n; i ++ ) {
double state0 = f[1];
double state1 = max(f[0], f[1]) + b[i];
f[0] = state0, f[1] = state1;
}
return max(f[0], f[1]) >= eps;
};
double l = 0.0, r = 1e9;
while (r - l > eps) {
double mid = (l + r) / 2;
for (int i = 1; i <= n; i ++ )
b[i] = a[i] - mid;
if (check()) l = mid;
else r = mid;
}
printf("%.6lf\n", l);
}
{
vector<int> b(n + 1);
function<bool()> check1 = [&]() {
vector<int> f(2);
f[0] = 0, f[1] = b[1];
for (int i = 2; i <= n; i ++ ) {
int state0 = f[1];
int state1 = max(f[0], f[1]) + b[i];
f[0] = state0, f[1] = state1;
}
return max(f[0], f[1]) >= 1;
};
int l = 0, r = 1e9;
while (l < r) {
int mid = l + r + 1 >> 1;
for (int i = 1; i <= n; i ++ )
b[i] = (a[i] >= mid ? 1 : -1);
if (check1()) l = mid;
else r = mid - 1;
}
printf("%d\n", l);
}
return 0;
}
F
线性基 + 贪心
先将所有的物品从小到大排序,之后遍历每个物品
集合\(S\)表示已经选的物品,假设已经放入\(p_1,...,p_{k-1}\)个物品
如果当前物品可以由集合\(S\)中的元素凑出则不添加
如果当前物品不能由集合\(S\)中的元素凑出则一定要添加
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 1e5 + 10;
int n, m = 1;
int a[N];
int main() {
scanf("%d", &n);
vector<int> basis(n);
vector<int> c(1 << n);
vector<int> order(1 << n);
for (int i = 1; i < (1 << n); i ++ ) scanf("%d", &c[i]);
iota(order.begin(), order.end(), 0);
sort(order.begin(), order.end(), [&](int i, int j) {
return c[i] < c[j];
});
LL ans = 0;
for (auto x : order) {
int mask = x;
for (int i = 0; i < n; i ++ ) {
if (mask >> i & 1) {
if (basis[i] == 0) {
basis[i] = mask;
break;
}
mask ^= basis[i];
}
}
if (mask != 0)
ans += c[x];
}
printf("%lld\n", ans);
return 0;
}
剩下的题目待补