算法竞赛备考冲刺必刷题(C++) | AcWing 3347 菊花链

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

AcWing:3347. 菊花链 - AcWing题库

【题目描述】

每天,作为她绕农场行走的一部分,奶牛 Bessie 会经过她最喜爱的草地,其中种有 N N N 朵花(五颜六色的雏菊),编号为 1 … N 1\dots N 1N,排列成一行。

i i i p i p_i pi 朵花瓣。

作为一名崭露头角的摄影家,Bessie 决定给这些花拍些照片。

具体地说,对于每一对满足 1 ≤ i ≤ j ≤ N 1\le i\le j\le N 1ijN 的花 ,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 p1pN

【输出】

输出存在平均的花的照片数量。

【输入样例】

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值