VP Educational Codeforces Round 18
A. New Bus Route
题意:给你
答案一定在排序后相邻的两个数里。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::sort(a.begin(), a.end());
int ans = 2e9, cnt = 0;
for (int i = 1; i < n; ++ i) {
if (a[i] - a[i - 1] < ans) {
ans = a[i] - a[i - 1];
cnt = 1;
} else if (a[i] - a[i - 1] == ans) {
++ cnt;
}
}
std::cout << ans << " " << cnt << "\n";
}
B. Counting-out Rhyme
题意:每次以一个人为起点,在环里走
模拟题,
点击查看代码
void solve() {
int n, k;
std::cin >> n >> k;
std::vector<int> a(k);
for (int i = 0; i < k; ++ i) {
std::cin >> a[i];
}
std::vector<int> b(n);
std::iota(b.begin(), b.end(), 0);
for (int i = 0; i < k; ++ i, -- n) {
int p = a[i] % n;
std::cout << b[p] + 1 << " \n"[i == k - 1];
std::vector<int> c(b.begin() + p + 1, b.end());
for (int j = 0; j < p; ++ j) {
c.push_back(b[j]);
}
b = c;
}
}
C. Divide by Three
题意:给你一个大数,你要删去一些数使得这个数没有前导零且是3的倍数。
3的倍数就是每一位加起来是3的倍数。
那么我们考虑
点击查看代码
void solve() {
std::string s;
std::cin >> s;
int n = s.size();
const int inf = 1e9;
std::vector f(n + 1, std::vector<int>(3, inf));
std::vector pre(n + 1, std::vector<int>(3, -1));
f[0][0] = 0;
auto change = [&](int i, int j, int x, int y, int v) -> void {
if (f[i][j] + v < f[x][y]) {
f[x][y] = f[i][j] + v;
pre[x][y] = j;
}
};
for (int i = 0; i < n; ++ i) {
int d = s[i] - '0';
for (int j = 0; j < 3; ++ j) {
change(i, j, i + 1, j, 1);
if (d == 0 && f[i][j] == i) {
continue;
}
change(i, j, i + 1, (j + d) % 3, 0);
}
}
if (f[n][0] >= n) {
if (s.find('0') != s.npos) {
std::cout << "0\n";
} else {
std::cout << -1 << "\n";
}
return;
}
std::string ans;
for (int i = n, j = 0; i ; -- i) {
if (f[i][j] == f[i - 1][pre[i][j]]) {
ans += s[i - 1];
}
j = pre[i][j];
}
while (ans.size() > 1 && ans.back() == '0') {
ans.pop_back();
}
if (ans.empty()) {
std::cout << -1 << "\n";
return;
}
std::reverse(ans.begin(), ans.end());
std::cout << ans << "\n";
}
D. Paths in a Complete Binary Tree
题意:一棵满二叉树,每个节点的编号就是这个点在中序遍历时的时间戳。给出一个操作序列,从某个位置往上往左往右走,求最后到哪个点。
找规律题。首先发现每一层数的编号是一个等差序列,第
点击查看代码
void solve() {
i64 n, q;
std::cin >> n >> q;
while (q -- ) {
i64 x;
std::cin >> x;
i64 y = x & -x;
std::string s;
std::cin >> s;
for (auto & c : s) {
if (c == 'U') {
if (y * 2 == n + 1) {
continue;
} else {
if ((x - y) / (y * 2) % 2 == 0) {
x += y;
} else {
x -= y;
}
y *= 2;
}
} else if (c == 'L') {
if (x & 1) {
continue;
} else {
x -= y / 2;
y /= 2;
}
} else {
if (x & 1) {
continue;
} else {
x += y / 2;
y /= 2;
}
}
}
std::cout << x << "\n";
}
}
E. Colored Balls
题意:
如果一个
假设
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::sort(a.begin(), a.end());
const i64 inf = 1e18;
auto check = [&](int k) -> i64 {
if (k <= 0) {
return inf;
}
i64 sum = 0;
for (int i = 0; i < n; ++ i) {
if (a[i] % k > a[i] / k) {
return inf;
}
sum += (a[i] + k) / (k + 1);
}
return sum;
};
i64 ans = inf;
for (int i = 1; i <= a[0] / i; ++ i) {
ans = std::min({ans, check(i), check(i - 1)});
ans = std::min({ans, check(a[0] / i), check(a[0] / i - 1)});
}
std::cout << ans << "\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具