牛客周赛 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;
}