牛客周赛 Round 32

A

void solve()
{
    ll v, x, y;
    cin >> v >> x >> y;
    cout << v / x * y << endl;
}

B

总共三种情况,直接模拟计算

void solve()
{
    vector<vector<char>> a(4, vector<char>(4));
    for (int i = 1; i <= 3; i++)
        for (int j = 1; j <= 3; j++)
            cin >> a[i][j];
    vector<int> ans(3, 0);
    ans[0] += a[1][1] != 'd';
    ans[0] += a[1][2] != 'f';
    ans[0] += a[1][3] != 's';
    ans[0] += a[2][1] != 'f';
    ans[0] += a[3][1] != 's';

    ans[1] += a[1][2] != 'd';
    ans[1] += a[2][1] != 'd';
    ans[1] += a[2][2] != 'f';
    ans[1] += a[2][3] != 's';
    ans[1] += a[3][2] != 's';

    ans[2] += a[1][3] != 'd';
    ans[2] += a[2][3] != 'f';
    ans[2] += a[3][3] != 's';
    ans[2] += a[3][1] != 'd';
    ans[2] += a[3][2] != 'f';
    cout << min({ans[0], ans[1], ans[2]});
}

C

排序后与排列的差的绝对值就是答案。
交换排序后数组中的任意两个一定会使答案变大或不变,可以自己分类讨论一下(

void solve()
{
    ll n, ans = 0;
    cin >> n;
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    sort(a.begin() + 1, a.end());
    for (int i = 1; i <= n; i++)
        ans += abs(i - a[i]);
    cout << ans << endl;
}

D

树形dp

void solve()
{
    int n;
    cin >> n;
    vector<char> a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    vector<vector<int>> e(n + 1);
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        e[u].push_back(v), e[v].push_back(u);
    }
    vector<ll> f(n + 1, 0);
    auto dfs = [&](const auto &dfs, int u, int fa) -> void
    {
        for (auto to : e[u])
            if (to != fa)
            {
                dfs(dfs, to, u);
                f[u] += (a[to] == '1');
                f[u] += f[to];
            }
    };
    dfs(dfs, 1, 0);
    for (int i = 1; i <= n; i++)
        cout << f[i] << endl;
}

E

考虑回文串的性质,至多有一种数字是奇数,根据这条性质,可以用一个2进制数0 ~ 9的数量的奇偶性(数量是指1~i的和),用map维护即可

void solve()
{
    map<ll, ll> mp;
    string s;
    cin >> s;
    ll res = 0, ans = 0;
    mp[0] = 1;
    for (int i = 0; i < s.size(); i++)
    {
        int u = s[i] - '0';
        res ^= (1 << u);
        ans += mp[res];
        for (int j = 0; j <= 9; j++)
            ans += mp[res ^ (1 << j)];
        mp[res]++;
    }
    cout << ans << endl;
}

F

状压dp

void solve()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int>> a(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            char c;
            cin >> c;
            if (c == 'r')
                a[i][j] = 0;
            else if (c == 'e')
                a[i][j] = 1;
            else
                a[i][j] = 2;
        }
    auto cal = [&](int a, int b)
    {
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            ans += (a % 10 != b % 10);
            a /= 10, b /= 10;
        }
        return ans;
    };
    vector<vector<ll>> f(m + 1, vector<ll>(3000, 0));
    vector<int> st;
    auto dfs = [&](auto dfs, int u, int res)
    {
        if (u > n)
        {
            st.push_back(res);
            return;
        }
        for (int i = 0; i <= 2; i++)
            if (i != res % 10)
                dfs(dfs, u + 1, res * 10 + i);
    };
    for (int i = 0; i <= 2; i++)
        dfs(dfs, 2, i);
    sort(st.begin(), st.end());
    st.erase(unique(st.begin(), st.end()), st.end());
    for (int i = 1; i <= m; i++)
    {
        int now = 0;
        for (int j = 1; j <= n; j++)
            now = now * 10 + a[j][i];
        for (auto e : st)
        {

            f[i][e] = cal(e, now);
            ll add = 1e18;
            for (auto t : st)
                if (cal(t, e) == n)
                    add = min(add, f[i - 1][t]);
            f[i][e] += add;
        }
    }
    ll ans = 1e18;
    for (auto e : st)
        ans = min(ans, f[m][e]);
    cout << ans << endl;
}
posted @ 2024-02-11 21:00  0x3ea  阅读(28)  评论(0编辑  收藏  举报