AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 435
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:AtCoder Beginner Contest竞赛题解 | 汇总
A - Triangular Number
【题目来源】
洛谷:[AT_abc435_a ABC435A] Triangular Number - 洛谷
【题目描述】
给定一个正整数 \(N\)。
请输出从 \(1\) 到 \(N\) 的所有整数之和,即 \(1+2+\cdots+N\)。
【输入】
从标准输入中读取一行,格式如下:
\(N\)
【输出】
输出从 \(1\) 到 \(N\) 的所有整数之和。
【输入样例】
5
【输出样例】
15
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n; // 输入的正整数n
int main()
{
// 输入正整数n
cin >> n;
// 计算1到n的和,并输出结果
// 公式:S = n(n+1)/2
cout << (n + 1) * n / 2 << endl;
return 0;
}
【运行结果】
5
15
B - No-Divisible Range
【题目来源】
洛谷:[AT_abc435_b ABC435B] No-Divisible Range - 洛谷
【题目描述】
给定一个长度为 \(N\) 的正整数序列 \(A=(A_1,A_2,\ldots,A_N)\)。
请你求出有多少对整数 \((l,r)\) 满足 \(1\leq l\leq r\leq N\),并且满足以下条件:
对于每一个满足 \(l\leq i\leq r\) 的整数 \(i\),\(A_i\) 不是 \(A_l+A_{l+1}+\cdots+A_r\) 的约数。
【输入】
输入从标准输入中读入,格式如下:
\(N\) \(A_1\) \(A_2\) $ \ldots $ \(A_N\)
【输出】
输出满足条件的对数。
【输入样例】
5
8 6 10 5 7
【输出样例】
6
【算法标签】
《洛谷 AT_abc435_b No-Divisible Range》 #枚举#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 55; // 最大数组长度
int n; // 数组长度
int ans; // 答案:符合条件的区间数量
int a[N]; // 原始数组
int sa[N]; // 前缀和数组,sa[i]=a[1]+a[2]+...+a[i]
/**
* 检查区间[l,r]的和是否能被区间内任意一个数整除
* @param res 区间和
* @param l 区间左端点
* @param r 区间右端点
* @return 如果区间和不能被区间内任意数整除,返回true;否则返回false
*/
bool check(int res, int l, int r)
{
// 遍历区间[l,r]内的每个数
for (int i = l; i <= r; i++)
{
// 如果区间和能被a[i]整除,则不符合条件
if (res % a[i] == 0)
{
return false;
}
}
// 区间和不能被区间内任意数整除
return true;
}
int main()
{
// 输入数组长度
cin >> n;
// 输入数组并计算前缀和
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sa[i] = sa[i - 1] + a[i]; // 前缀和
}
// 枚举所有区间[i,j]
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
{
// 计算区间[i,j]的和
int tot = sa[j] - sa[i - 1];
// 调试输出
// cout << "tot " << tot << endl;
// 检查区间和是否能被区间内任意数整除
if (!check(tot, i, j))
{
continue; // 不符合条件,跳过
}
// 调试输出
// cout << "i j " << i << " " << j << endl;
// 符合条件,计数加1
ans++;
}
}
// 输出结果
cout << ans << endl;
return 0;
}
【运行结果】
5
8 6 10 5 7
6

浙公网安备 33010602011771号