首页 > 试题广场 >

小店的经营分析

[编程题]小店的经营分析
  • 热度指数:599 时间限制: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 整理上传
#include <stdio.h>

int main() {
    int n, l,r,p[10000],pre[10001];
    int count=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&p[i]);
    scanf("%d",&l);
    scanf("%d",&r);
    pre[0]=0;
    for(int i=0;i<n;i++)
        pre[i+1]=pre[i]+p[i];
    for (int i = 0; i < n; i++) {
        // 内层:子数组结束位置j(j >= i)
        for (int j = i; j < n; j++) {
            // 计算p[i]到p[j]的和 = pre[j+1] - pre[i]
            int sum = pre[j+1] - pre[i];
            // 判断是否在区间内
            if (sum >= l && sum <= r) {
                count++;
            }
        }
    }
    printf("%d",count);              
}
发表于 2026-01-07 21:18:23 回复(0)
前缀和
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)
dp表查找
const len = +(await readline());
    const records = (await readline()).split(" ").map(Number);
    const area = (await readline()).split(" ").map(Number);
    const dp = Array.from({ length: len }, (_, index) =>
        Array(len - index).fill(0)
    );
    let res = 0;
    for (let i = 0; i < len; i++) {
        for (let j = i; j < len; j++) {
            if (j === i) dp[i][j - i] = records[j];
            if (j > i) dp[i][j - i] = dp[i][j - i - 1] + records[j];

            if (area[0] <= dp[i][j - i] && dp[i][j - i] <= area[1]) res++;
        }
    }

    console.log(res);


发表于 2026-01-05 04:08:18 回复(0)
// 前缀和的思想 go实现
package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

var in = bufio.NewScanner(os.Stdin)

func readInt() int{
    in.Scan()
    num, _ := strconv.Atoi(strings.TrimSpace(in.Text()))
    return num
}

func readLineInts() []int {
    in.Scan()
    fields := strings.Fields(strings.TrimSpace(in.Text()))
    nums := make([]int, len(fields))
    for i, f := range fields {
        nums[i],_ = strconv.Atoi(f)
    }
    return nums
}

func getMoneyCount(n int, pArr []int, left int, right int) int{
    if n == 0 {
        return 0
    }
    prefixSum := make([]int, n+1)
    for i, num := range pArr {
        prefixSum[i+1] = prefixSum[i] + num
    }
    count := 0
    for i:=0; i<=n; i++{
        for j:=i+1; j <=n; j++{
            if prefixSum[j] - prefixSum[i] >= left  &&
            prefixSum[j] - prefixSum[i] <= right {
                count ++
            }
        }
    }
    return count
}

func main() {
    n := readInt()
    pArr := readLineInts()
    lrArr := readLineInts()
    fmt.Println(getMoneyCount(n, pArr, lrArr[0], lrArr[1]))
}
发表于 2025-12-26 10:39:53 回复(0)