小张开了一家小小的咖啡店,他习惯于记录每天的盈利状况。
盈利记为正数,亏损则记为负数。
经过一段时间的经营,他收集了连续
天的经营数据。
为了评估不同时段的经营效益,小张设定了一个“目标利润区间”
。
他现在想知道,在这
天里,有多少个连续的经营周期(例如,从第
天到第
天),其总利润恰好落在了他设定的目标区间内?
这个问题对小张来说有些复杂,您能编程帮他快速统计出结果吗?
第一行 : 一个整数,代表记录的总天数。
()
第二行 :个整数,代表一个数组
,其中
表示第
天的利润或亏损。
()
第三行 : 两个整数和
,用空格隔开,代表目标利润区间的左右边界。
()
一个整数,表示总利润在区间内的连续经营周期的总数量。
4 1 -1 1 -1 0 0
4
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();
}
}
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);