本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
AcWing:3347. 菊花链 - AcWing题库
【题目描述】
每天,作为她绕农场行走的一部分,奶牛 Bessie 会经过她最喜爱的草地,其中种有 N N N 朵花(五颜六色的雏菊),编号为 1 … N 1\dots N 1…N,排列成一行。
花 i i i 有 p i p_i pi 朵花瓣。
作为一名崭露头角的摄影家,Bessie 决定给这些花拍些照片。
具体地说,对于每一对满足 1 ≤ i ≤ j ≤ N 1\le i\le j\le N 1≤i≤j≤N 的花 ,Bessie 会给从花 i i i 到花 j j j 之间的所有花(包括 i i i 和 j j j)拍一张照。
后来 Bessie 查看这些照片时注意到有些照片里存在「平均」的花——一朵恰好有 P P P 朵花瓣的花,其中 P P P 等于照片中所有花的花瓣数量的平均值。
Bessie 的照片中有几张存在平均的花?
【输入】
输入的第一行包含 N N N。
第二行包含 N N N 个空格分隔的整数 p 1 … p N p_1\dots p_N p1…pN。
【输出】
输出存在平均的花的照片数量。
【输入样例】
4
1 1 2 3
【输出样例】
6
【算法标签】
《AcWing 3347 菊花链》 #枚举# #哈希表#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 1005; // 定义数组最大长度
int n; // 数组长度
int ans; // 统计满足条件的子区间个数
int a[N]; // 存储原始数组
int s[N]; // 存储前缀和数组
int main()
{
// 输入数组长度
cin >> n;
// 输入数组元素并计算前缀和
for (int i = 1; i <= n; i++)
{
cin >> a[i];
s[i] = s[i - 1] + a[i]; // 计算前缀和
}
// 枚举所有可能的子区间[L, R]
for (int L = 1; L <= n; L++)
{
for (int R = L; R <= n; R++)
{
// 计算子区间和
int p = s[R] - s[L - 1];
// 计算子区间长度
int cnt = R - L + 1;
// 检查子区间平均值是否为整数
if (p % cnt == 0)
{
// 计算平均值
int p0 = p / cnt;
// 检查子区间中是否存在等于平均值的元素
for (int i = L; i <= R; i++)
{
if (a[i] == p0)
{
ans++; // 存在则计数
break; // 找到一个即可
}
}
}
}
}
// 输出满足条件的子区间总数
cout << ans << endl;
return 0;
}
【运行结果】
4
1 1 2 3
6