AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 440
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:AtCoder Beginner Contest竞赛题解 | 汇总
A - Octave
【题目来源】
洛谷:[AT_abc440_a ABC440A] Octave - 洛谷
【题目描述】
音高每增加 \(1\) 个八度,声音的频率就增加一倍。
如果把频率为 \(X\) 赫兹的声音的音高提高 \(Y\) 个八度,那么它的频率将是多少赫兹?
【输入】
输入以标准输入的形式给出,格式如下:
\(X \ Y\)
【输出】
在一行中以整数形式输出答案。省略单位(赫兹)。
【输入样例】
110 2
【输出样例】
440
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int x, y;
int main()
{
cin >> x >> y;
for (int i = 1; i <= y; i++) {
x *= 2; // 将x乘以2
}
cout << x << endl;
return 0;
}
【运行结果】
110 2
440
B - Trifecta
【题目来源】
洛谷:[AT_abc440_b ABC440B] Trifecta - 洛谷
【题目描述】
编号为 \(1\) 至 \(N\) 的 \(N\) 匹马参加了一场比赛。
所有马匹同时出发,马匹 \(i\) 从起点到终点用时 \(T_i\) 秒。
找出获得第 \(1\) 名、第 \(2\) 名和第 \(3\) 名的马匹编号。保证所有 \(T_i\) 互不相同。
【输入】
输入以标准输入的形式给出,格式如下:
\(N\)
\(T_1\) \(\dots\) \(T_N\)
【输出】
输出第 \(1\) 名、第 \(2\) 名和第 \(3\) 名的马匹编号,按此顺序,用空格分隔。
【输入样例】
4
100 110 105 95
【输出样例】
4 1 3
【算法标签】
《洛谷 AT_abc440_b Trifecta》 #排序#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 35;
int n;
struct Node
{
int t, idx; // t: 时间, idx: 原始编号
} a[N];
// 比较函数:按时间t升序排序
bool cmp(Node x, Node y)
{
return x.t < y.t;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i].t; // 输入时间
a[i].idx = i; // 记录原始编号
}
// 按时间升序排序
sort(a + 1, a + n + 1, cmp);
// 输出前3个最短时间的原始编号
for (int i = 1; i <= 3; i++)
cout << a[i].idx << " ";
cout << endl;
return 0;
}
【运行结果】
4
100 110 105 95
4 1 3
C - Striped Horse
【题目来源】
洛谷:[AT_abc440_c ABC440C] Striped Horse - 洛谷
【题目描述】
问题陈述
林格先生想给一匹马画上斑马纹。
有 \(N\) 个方格,编号为 \(1\) 至 \(N\) 排列成一行。
初始时,所有方格都是白色的,将方格 \(i\) 涂成黑色的成本是 \(C_i\) 。
考虑执行下面的程序一次,将一些方格涂成黑色:
- 自由选择一个正整数 \(x\) 。
- 对于所有满足 \(1 \leq i \leq N\) 的整数 \(i\),若 \((i + x)\) 除以 \(2W\) 后的余数小于 \(W\),则将正方形 \(i\) 涂成黑色。
求执行此程序的最小总成本。
给你 \(T\) 个测试用例,请逐个求解。
【输入】
输入内容由标准输入法提供,格式如下,其中 \(\mathrm{case}_i\) 表示第 \(i\) 个测试用例。
\(T\)
\(\mathrm{case}_1\)
\(\vdots\)
\(\mathrm{case}_T\)
每个测试用例的格式如下:
\(N\) \(W\)
\(C_1\) \(\dots\) \(C_N\)
【输出】
输出 \(T\) 行。第 \(i\) 行应包含第 \(i\) 个测试用例的答案。
【输入样例】
4
8 2
1 10 10 1 1 10 10 1
8 3
1 10 10 1 1 10 10 1
8 4
1 10 10 1 1 10 10 1
4 100
100000 100000 100000 100000
【输出样例】
4
12
22
0
【算法标签】
《洛谷 AT_abc440_c Striped Horse》 #数学# #贪心# #前缀和#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 200005 * 2;
int T, n, a[N], w, sa[N], dp[N];
signed main()
{
cin >> T;
while (T--)
{
cin >> n >> w;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = n + 1; i <= n + w; i++)
a[i] = 0; // 扩展数组,填充0
// 计算前缀和
for (int i = 1; i <= n + w; i++)
sa[i] = sa[i-1] + a[i];
// 动态规划
for (int i = 1; i <= n + w; i++)
{
if (i > 2 * w)
dp[i] = dp[i - 2 * w] + (sa[i] - sa[i - w]);
else if (i > w)
dp[i] = (sa[i] - sa[i - w]);
else
dp[i] = sa[i];
}
// 寻找最小值
int ans = 1e18;
for (int i = max(1LL, n - w + 1); i <= n + w; i++)
ans = min(ans, dp[i]);
cout << ans << endl;
}
return 0;
}
【运行结果】
8 2
1 10 10 1 1 10 10 1
4
8 3
1 10 10 1 1 10 10 1
12
8 4
1 10 10 1 1 10 10 1
22
4 100
100000 100000 100000 100000
0

浙公网安备 33010602011771号