VP Educational Codeforces Round 9
A. Grandma Laura and Apples
题意:一开始你有一个
先通过反推求出
点击查看代码
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<std::string> s(n);
for (int i = 0; i < n; ++ i) {
std::cin >> s[i];
}
std::reverse(s.begin(), s.end());
i64 sum = 1;
for (int i = 1; i < n; ++ i) {
if (s[i] == "halfplus") {
sum = sum * 2 + 1;
} else {
sum = sum * 2;
}
}
i64 ans = 0;
std::reverse(s.begin(), s.end());
for (int i = 0; i < n; ++ i) {
if (s[i] == "halfplus") {
ans = ans + sum / 2 * m + m / 2;
} else {
ans = ans + sum / 2 * m;
}
sum /= 2;
}
std::cout << ans << "\n";
}
B. Alice, Bob, Two Teams
题意:给你一个
预处理一个
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::string s;
std::cin >> s;
std::vector<i64> suma(n + 1), sumb(n + 1);
for (int i = 0; i < n; ++ i) {
suma[i + 1] = suma[i] + (s[i] == 'A' ? a[i] : 0);
sumb[i + 1] = sumb[i] + (s[i] == 'B' ? a[i] : 0);
}
i64 ans = sumb[n];
for (int i = n; i >= 1; -- i) {
ans = std::max(ans, sumb[i - 1] + suma[n] - suma[i - 1]);
}
for (int i = 1; i <= n; ++ i) {
ans = std::max(ans, sumb[n] - sumb[i] + suma[i]);
}
std::cout << ans << "\n";
}
C. The Smallest String Concatenation
题意:给你
直接排序即可,排序判断就是直接看谁在前面是组成的字符串更小。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<std::string> s(n);
for (int i = 0; i < n; ++ i) {
std::cin >> s[i];
}
std::sort(s.begin(), s.end(), [&](std::string & s, std::string & t) {
return s + t < t + s;
});
for (auto & x : s) {
std::cout << x;
}
std::cout << "\n";
}
D. Longest Subsequence
题意:给你一个数组,你要选尽可能多少数使得它们的
发现
点击查看代码
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::vector<std::vector<int>> factor(m + 1);
for (int i = 1; i <= m; ++ i) {
for (int j = i; j <= m; j += i) {
factor[j].push_back(i);
}
}
std::vector<int> cnt(m + 1);
for (int i = 0; i < n; ++ i) {
if (a[i] <= m) {
cnt[a[i]] += 1;
}
}
std::vector<int> sum(m + 1);
for (int i = 1; i <= m; ++ i) {
for (auto & j : factor[i]) {
sum[i] += cnt[j];
}
}
int max = 0, p = 0;
for (int i = 1; i <= m; ++ i) {
if (sum[i] > max) {
max = sum[i];
p = i;
}
}
if (p == 0) {
std::cout << 1 << " " << 0 << "\n";
return;
}
std::vector<int> ans;
for (int i = 0; i < n; ++ i) {
if (p % a[i] == 0) {
ans.push_back(i);
}
}
std::cout << p << " " << ans.size() << "\n";
for (auto & x : ans) {
std::cout << x + 1 << " \n"[x == ans.back()];
}
}
E. Thief in a Shop
题意:
很显然的完全背包,可以记
点击查看代码
void solve() {
int n, k;
std::cin >> n >> k;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
int min = *std::min_element(a.begin(), a.end());
for (auto & x : a) {
x -= min;
}
const int N = 1e6 + 5, inf = 1e9;
std::vector<int> f(N, inf);
f[0] = 0;
for (int i = 0; i < n; ++ i) {
for (int j = a[i]; j < N; ++ j) {
f[j] = std::min(f[j], f[j - a[i]] + 1);
}
}
for (int i = 0; i < N; ++ i) {
if (f[i] <= k) {
std::cout << i + k * min << " ";
}
}
std::cout << "\n";
}
F. Magic Matrix
题意:给你一个矩阵,判断是不是满足三个条件:
- 对于
。 - 对于
。 - 对于
。
如果满足前两个条件,那么第三个条件可以变化为:
那么我们可以类似
点击查看代码
struct DSU {
std::vector<int> fa, cnt;
DSU(int _n) {
init(_n);
}
void init(int _n) {
fa.assign(_n, 0);
cnt.assign(_n, 1);
std::iota(fa.begin(), fa.end(), 0);
}
int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
bool merge(int x, int y) {
x = find(x), y = find(y);
if (x == y) {
return false;
}
fa[y] = x;
cnt[x] += cnt[y];
return true;
}
bool same(int x, int y) {
return find(x) == find(y);
}
int size(int x) {
return cnt[find(x)];
}
};
void solve() {
int n;
std::cin >> n;
std::vector a(n, std::vector<int>(n));
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
std::cin >> a[i][j];
}
}
for (int i = 0; i < n; ++ i) {
if (a[i][i] != 0) {
std::cout << "NOT MAGIC\n";
return;
}
for (int j = 0; j < n; ++ j) {
if (a[i][j] != a[j][i]) {
std::cout << "NOT MAGIC\n";
return;
}
}
}
std::vector<std::array<int, 3>> edges;
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
if (i == j) {
continue;
}
edges.push_back({a[i][j], i, j});
}
}
std::sort(edges.begin(), edges.end());
DSU dsu(n);
for (int i = 0; i < edges.size(); ++ i) {
int j = i;
while (j < edges.size() && edges[j][0] == edges[i][0]) {
++ j;
}
-- j;
for (int k = i; k <= j; ++ k) {
if (dsu.same(edges[k][1], edges[k][2])) {
std::cout << "NOT MAGIC\n";
return;
}
}
for (int k = i; k <= j; ++ k) {
dsu.merge(edges[k][1], edges[k][2]);
}
i = j;
}
std::cout << "MAGIC\n";
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析