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

剩下的题目待补

posted @ 2022-01-24 10:13  Angels_of_Death  阅读(96)  评论(0)    收藏  举报