专栏文章
AtCoder Beginner Contest 378 A~C
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqv5svr
- 此快照首次捕获于
- 2025/12/04 11:15 3 个月前
- 此快照最后确认于
- 2025/12/04 11:15 3 个月前
A - Pairing
题目
有四个球,第 个球的颜色是 。
选择两个颜色相同的球,然后把两个球都丢掉,求这样操作的最大次数。
代码
CPP#include <bits/stdc++.h>
using namespace std;
int a, b, c, d, cnt[4], sum;
int main()
{
scanf("%d %d %d %d", &a, &b, &c, &d);
cnt[a - 1] ++;
cnt[b - 1] ++;
cnt[c - 1] ++;
cnt[d - 1] ++;
if (cnt[0] == 4)
sum += 2;
else if (cnt[0] >= 2)
sum ++;
if (cnt[1] == 4)
sum += 2;
else if (cnt[1] >= 2)
sum ++;
if (cnt[2] == 4)
sum += 2;
else if (cnt[2] >= 2)
sum ++;
if (cnt[3] == 4)
sum += 2;
else if (cnt[3] >= 2)
sum ++;
cout << sum << '\n';
return 0;
}
B - Garbage Collection
题目
在 AtCoder City,有 种垃圾会被定期收集。第 个类型的垃圾 在日期模 等于 的日子被收集。
有 个问题。在 的 次查询中,考虑到 次类型的垃圾是在 这一天投放的,请回答下一天将在哪一天收集垃圾。
在这里,如果第 个类型的垃圾是在收集该类型垃圾的当天投放的,那么垃圾将在同一天被收集。
思路
对于某个非负整数 来说,除以 的余数为 的日期表示为日 。因此,只要找出 的最小值 即可。
设 和 分别是 除以 的商和余数。那么,。现在比较 和 。
如果是 , 与 的最小值是 ,所以答案是 。
若 , 与 的最小值为 ,故答案为 。
代码
CPP#include <bits/stdc++.h>
using namespace std;
int n, Q, t, d, a, b, c, ans, q[110], r[110];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
scanf("%d %d", &q[i], &r[i]);
scanf("%d", &Q);
while (Q -- )
{
scanf("%d %d", &t, &d);
t --;
b = d / q[t];
c = d % q[t];
a = c <= r[t] ? b : b + 1;
ans = a * q[t] + r[t];
cout << ans << '\n';
}
return 0;
}
C - Repeating
题目
给你一个由 个正数 组成的数列。求长度为 的序列 的定义如下。
- 对于 ,定义 如下:
- 设 是在 之前出现元素 的最近位置。如果不存在这样的位置,则设为 。
更确切地说,如果存在一个正整数 ,使得 和 ,那么就让 成为最大的 。如果不存在这样的 ,则设 。
- 设 是在 之前出现元素 的最近位置。如果不存在这样的位置,则设为 。
思路
考虑在数组 中从头开始扫描序列 ,同时保留值 的最后出现位置,即最大值 与 。那么我们可以采用以下算法:
- 用 初始化数组 中的元素。
- 对每个 进行如下操作:
- 让 。
- 让 。
这个问题的关键在于 的长度可以达到 ,这就需要保留长度为 的数组 ,但这并不适合内存。
在这种情况下,使用关联数组是非常有用的。数组存储与特定索引相对应的值。不过,它可以接受任意的索引集,只记忆所需的部分。在我们的问题中, 最多可以是 ,但实际的索引仅限于 中出现的值(最多有 种),这样我们就可以减少所需的内存。
大多数语言都将关联数组作为标准功能。在 C++ 中,可以使用
map 或 unordered_map;在 Python 中,可以使用 dict。代码
C++ 版本要高,否则 CE。
CPP#include <bits/stdc++.h>
using namespace std;
int n;
map<int, int> last;
int main()
{
scanf("%d", &n);
vector<int> a(n), b(n, -1);
for (auto& x : a)
scanf("%d", &x);
for (int i = 0; i < n; i ++ )
{
if (last.contains(a[i]))
b[i] = last[a[i]];
last[a[i]] = i + 1;
}
for (int i = 0; i < n; i ++ )
cout << b[i] << (i < n - 1 ? ' ' : '\n');
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...