3347 菊花链(暴力枚举、哈希表)

1. 问题描述:

每天,作为她绕农场行走的一部分,奶牛 Bessie 会经过她最喜爱的草地,其中种有 N 朵花(五颜六色的雏菊),编号为 1…N,排列成一行。花 i 有 pi 朵花瓣。作为一名崭露头角的摄影家,Bessie 决定给这些花拍些照片。具体地说,对于每一对满足 1 ≤ i ≤ j ≤ N 的花 (i,j),Bessie 会给从花 i 到花 j 之间的所有花(包括 i 和 j)拍一张照。后来 Bessie 查看这些照片时注意到有些照片里存在「平均」的花——一朵恰好有 P 朵花瓣的花,其中 P 等于照片中所有花的花瓣数量的平均值。Bessie 的照片中有几张存在平均的花?

输入格式

输入的第一行包含 N。第二行包含 N 个空格分隔的整数 p1…pN。

输出格式

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

数据范围

1 ≤ N ≤ 100,
1 ≤ pi ≤ 1000

输入样例:

4
1 1 2 3

输出样例:

6
样例解释
每张仅包含一朵花的照片均会被计入答案(在这个样例中有 4 张)。另外,在这个样例中 (i,j) 为 (1,2) 和 (2,4) 所对应的照片也存在平均的花。
来源:https://www.acwing.com/problem/content/description/3350/

2. 思路分析:

分析题目可以知道已知一个序列,问我们有多少个区间,使得区间中存在一个数字pi是区间[l,r]的平均数,因为时间复杂度为100,所以时间复杂度控制在O(n ^ 3)以内即可,可以枚举区间的左右端点,这样时间复杂度为O(n ^ 2),还可以使用O(n)的事件复杂度来判断是否存在这样一个数字pi,判断的时候直接枚举区间[l,r]中的所有数字判断是否存在这样的一个数字即可,除了暴力枚举之外区间中的所有数字来判断之外其实还可以使用哈希表来判断一个数字是否存在,我们在枚举区间[l,r]的时候可以将数字插入到哈希表中即可。

3. 代码如下:

暴力枚举:

class Solution:
    # 暴力枚举即可
    def process(self):
        n = int(input())
        p = list(map(int, input().split()))
        res = 0
        # 枚举区间左右端点
        for i in range(n):
            s = 0
            for j in range(i, n):
                s += p[j]
                # count为区间中数的个数
                count = j - i + 1
                # 只有当能够整除的时候才往下进行
                if s % count == 0:
                    # 枚举区间[l, r]中是否存在这样的pk
                    for k in range(i, j + 1):
                        if p[k] == s // count:
                            res += 1
                            break
        return res


if __name__ == "__main__":
    print(Solution().process())

枚举 + 哈希表:

class Solution:
    def process(self):
        n = int(input())
        p = list(map(int, input().split()))
        res = 0
        # 枚举区间左右端点
        for i in range(n):
            s = 0
            mp = dict()
            for j in range(i, n):
                s += p[j]
                if p[j] not in mp: mp[p[j]] = 1
                # count为区间中数的个数
                count = j - i + 1
                # 判断一个数字是否在区间中
                if s % count == 0 and s // count in mp: res += 1
        return res


if __name__ == "__main__":
    print(Solution().process())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值