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())