1

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
posted @ 2026-01-20 21:21  热爱编程的通信人  阅读(0)  评论(0)    收藏  举报