程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Python 实现【几何平均值最大子数组】

hfteth 2025-01-14 13:55:17 技术文章 12 ℃
import math

def find_max_geometric_mean_subarray(n, l, numbers):
    # 计算对数值,避免直接使用乘积导致溢出
    log_numbers = [math.log(num) for num in numbers]
    
    max_mean = -float('inf')  # 初始化最大均值为负无穷
    best_start = -1          # 最优子数组起始位置
    best_length = 0          # 最优子数组长度
    
    # 前缀和,用于快速计算区间对数和
    prefix_sum = [0] * (n + 1)
    for i in range(1, n + 1):
        prefix_sum[i] = prefix_sum[i - 1] + log_numbers[i - 1]
    
    # 遍历所有长度 >= L 的子数组
    for length in range(l, n + 1):
        for start in range(n - length + 1):
            # 计算子数组的对数和
            end = start + length
            log_sum = prefix_sum[end] - prefix_sum[start]
            # 计算几何平均值的对数
            log_mean = log_sum / length
            
            # 更新最优解
            if log_mean > max_mean or (log_mean == max_mean and length < best_length):
                max_mean = log_mean
                best_start = start
                best_length = length
    
    return best_start, best_length


# 输入处理
n, l = map(int, input().split())
numbers = [int(input()) for _ in range(n)]

# 求解并输出结果
start, length = find_max_geometric_mean_subarray(n, l, numbers)
print(start, length)

Tags:

最近发表
标签列表