IAEPC Preliminary Contest (Codeforces Round 999, Div. 1 + Div. 2)
A. Kevin and Arithmetic
题意:给你
奇数后面加奇数才能是偶数,但一开始
所以如果有偶数就是奇数个数加1,否则是奇数个数减1.
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
int cnt[2]{};
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
++ cnt[a[i] & 1];
}
if (cnt[0]) {
std::cout << 1 + cnt[1] << "\n";
} else {
std::cout << std::max(0, cnt[1] - 1) << "\n";
}
}
B. Kevin and Geometry
题意:
对梯形作高发现两边是两个三角形,那么(上底-下底)/2是底边长,为了让梯形的两个腰边能够上上底,这个距离一定小于腰边。所以我们找两个相同的数作为腰边,然后找差值最小的两个数当上底和下底。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<i64> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::sort(a.begin(), a.end());
int p = -1;
for (int i = 0; i + 1 < n; ++ i) {
if (a[i] == a[i + 1]) {
p = i;
break;
}
}
if (p == -1) {
std::cout << -1 << "\n";
return;
}
for (int i = 0, j = 0; i + 1 < n; ++ i) {
while (i == p || i == p + 1) {
++ i;
}
j = std::max(j, i);
while (j == i || j == p || j == p + 1) {
++ j;
}
if (i < n && j < n && std::abs(a[i] - a[j]) < a[p] + a[p]) {
std::cout << a[j] << " " << a[i] << " " << a[p] << " " << a[p] << "\n";
return;
}
}
std::cout << -1 << "\n";
}
C. Kevin and Puzzle
题意:
如果
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n + 1);
for (int i = 1; i <= n; ++ i) {
std::cin >> a[i];
}
if (n == 1) {
std::cout << (1 + (a[1] == 0)) << "\n";
return;
}
std::vector f(n + 1, std::array<Z, 2>{});
f[1][0] = a[1] == 0;
f[1][1] = 1;
for (int i = 2; i <= n; ++ i) {
if (a[i] == a[i - 1]) {
f[i][0] += f[i - 1][0];
}
if (i >= 2 && a[i] - 1 == a[i - 2]) {
f[i][0] += f[i - 1][1];
}
f[i][1] = f[i - 1][0];
}
std::cout << f[n][0] + f[n][1] << "\n";
}
D. Kevin and Numbers
题意:两个数字
考虑反着来,从
注意最多操作
点击查看代码
void solve() {
int n, m;
std::cin >> n >> m;
std::priority_queue<int> a, b;
for (int i = 0; i < n; ++ i) {
int x;
std::cin >> x;
a.push(x);
}
for (int i = 0; i < m; ++ i) {
int x;
std::cin >> x;
b.push(x);
}
i64 sum = n - m;
while (sum >= 0 && a.size() && b.size()) {
if (a.top() == b.top()) {
a.pop();
b.pop();
} else if (sum > 0) {
int u = b.top(); b.pop();
b.push(u / 2);
b.push(u - u / 2);
-- sum;
} else {
break;
}
}
if (a.empty() && b.empty()) {
std::cout << "YES\n";
} else {
std::cout << "NO\n";
}
}
E. Kevin and And
题意:
发现
点击查看代码
void solve() {
int n, m, k;
std::cin >> n >> m >> k;
std::vector<i64> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::vector<i64> b(m);
for (int i = 0; i < m; ++ i) {
std::cin >> b[i];
}
std::vector<std::vector<i64> > op(m + 1);
for (int i = 0; i < 1 << m; ++ i) {
i64 x = (1ll << 30) - 1;
int cnt = 0;
for (int j = 0; j < m; ++ j) {
if (i >> j & 1) {
x &= b[j];
++ cnt;
}
}
op[cnt].push_back(x);
}
std::vector d(n, std::vector<i64>(m + 1));
for (int i = 0; i < n; ++ i) {
for (int j = 1; j <= m; ++ j) {
for (auto & x : op[j]) {
d[i][j] = std::max(d[i][j], a[i] - (a[i] & x));
}
d[i][j] = std::max(d[i][j], d[i][j - 1]);
}
for (int j = m; j >= 1; -- j) {
d[i][j] = d[i][j] - d[i][j - 1];
}
}
std::priority_queue<std::array<i64, 3> > heap;
for (int i = 0; i < n; ++ i) {
heap.push({d[i][1], 1, i});
}
i64 ans = std::accumulate(a.begin(), a.end(), 0ll);
while (k -- ) {
auto [x, cnt, id] = heap.top(); heap.pop();
ans -= x;
if (cnt + 1 <= m) {
heap.push({d[id][cnt + 1], cnt + 1, id});
}
}
std::cout << ans << "\n";
}
F1. Kevin and Binary String (Easy Version)
题意:给你两个01串
方案是固定的,所以模拟就好。
发现每个块交换后就会和其他块融合,而我们想要满足
点击查看代码
void solve() {
std::string s, t;
std::cin >> s >> t;
int n = s.size();
std::deque<int> a;
std::vector<int> b;
for (int i = 0; i < n; ++ i) {
int j = i;
while (j < n && s[j] == s[i]) {
++ j;
}
a.push_back((s[i] == '0' ? -1 : 1) * (j - i));
i = j - 1;
}
for (int i = 0; i < n; ++ i) {
int j = i;
while (j < n && t[j] == t[i]) {
++ j;
}
b.push_back((t[i] == '0' ? -1 : 1) * (j - i));
i = j - 1;
}
int ans = 0;
for (auto & x : b) {
if (a.empty()) {
std::cout << -1 << "\n";
return;
}
if (1ll * a.front() * x < 0) {
if (a.size() == 1) {
std::cout << -1 << "\n";
return;
}
if (a.size() == 2) {
std::swap(a[0], a[1]);
} else {
a[2] += a[0];
a.pop_front();
}
++ ans;
}
int m = std::abs(x) - std::abs(a.front());
int k = 0;
a.pop_front();
while (m > 0) {
if (a.empty()) {
std::cout << -1 << "\n";
return;
}
k += a.front();
a.pop_front();
if (a.empty()) {
std::cout << -1 << "\n";
return;
}
m -= std::abs(a.front());
a.pop_front();
++ ans;
}
if (m < 0) {
std::cout << -1 << "\n";
return;
}
if (a.empty()) {
a.push_back(k);
} else {
a[0] += k;
}
}
std::cout << ans << "\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!