首页 > 试题广场 >

小店的经营分析

[编程题]小店的经营分析
  • 热度指数:768 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 512M,其他语言1024M
  • 算法知识视频讲解
小张开了一家小小的咖啡店,他习惯于记录每天的盈利状况。
盈利记为正数,亏损则记为负数。
经过一段时间的经营,他收集了连续 N 天的经营数据。

为了评估不同时段的经营效益,小张设定了一个“目标利润区间” [L, R]
他现在想知道,在这 N 天里,有多少个连续的经营周期(例如,从第 i 天到第 j 天),其总利润恰好落在了他设定的目标区间内?

这个问题对小张来说有些复杂,您能编程帮他快速统计出结果吗?

输入描述:
第一行 : 一个整数 N,代表记录的总天数。
(1 < N \le 10000)
第二行 : N 个整数,代表一个数组 P,其中 P_i 表示第 i 天的利润或亏损。
(-255 \le P_i \le 255)
第三行 : 两个整数 LR,用空格隔开,代表目标利润区间的左右边界。
(-2550000 \le L \le R \le 2550000)


输出描述:
一个整数,表示总利润在区间 [L, R] 内的连续经营周期的总数量。
示例1

输入

4
1 -1 1 -1
0 0

输出

4
示例2

输入

3
-3 4 -2
-3 2

输出

5

备注:
本题由牛友@Charles 整理上传
前缀和
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int N = scanner.nextInt();
        int[] P = new int[N];
        for (int i = 0; i < N; i++) {
            P[i] = scanner.nextInt();
        }
        
        int L = scanner.nextInt();
        int R = scanner.nextInt();
        
        // 计算前缀和数组
        long[] prefixSum = new long[N + 1];
        prefixSum[0] = 0;
        for (int i = 1; i <= N; i++) {
            prefixSum[i] = prefixSum[i - 1] + P[i - 1];
        }
        
        int count = 0;
        // 枚举所有可能的区间 [i, j]
        for (int i = 0; i < N; i++) {
            for (int j = i; j < N; j++) {
                long sum = prefixSum[j + 1] - prefixSum[i];
                if (sum >= L && sum <= R) {
                    count++;
                }
            }
        }
        
        System.out.println(count);
        scanner.close();
    }
}


发表于 2026-01-06 17:46:35 回复(0)