AtCoder Beginner Contest 378 A~C
A - Pairing
洛谷链接
AtCoder链接
题目
有四个球,第
选择两个颜色相同的球,然后把两个球都丢掉,求这样操作的最大次数。
代码
#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链接
题目
在 AtCoder City,有
有
在这里,如果第
思路
对于某个非负整数
设
如果是
若
代码
#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
洛谷链接
AtCoder链接
题目
给你一个由
- 对于
i=1,2, \ldots, N ,定义B_i 如下:- 设
B_i 是在i 之前出现元素A_i 的最近位置。如果不存在这样的位置,则设为B_i=-1 。
更确切地说,如果存在一个正整数j ,使得A_i=A_j 和j<i ,那么就让B_i 成为最大的j 。如果不存在这样的j ,则设B_i=-1 。
- 设
思路
考虑在数组
- 用
-1 初始化数组\mathrm{last} 中的元素。 - 对每个
i=1,2, \ldots ,N 进行如下操作:- 让
B_i \leftarrow \mathrm{last}[A_i] 。 - 让
\mathrm{last}[A_i] \leftarrow i 。
- 让
这个问题的关键在于
在这种情况下,使用关联数组是非常有用的。数组存储与特定索引相对应的值。不过,它可以接受任意的索引集,只记忆所需的部分。在我们的问题中,
大多数语言都将关联数组作为标准功能。在 C++ 中,可以使用 map 或 unordered_map;在 Python 中,可以使用 dict。
代码
C++ 版本要高,否则 CE。
#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;
}