题目来自于博主算法大师 的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html
题目
给定一个含有 N
个正整数的数组,
求出有多少个连续区间(包括单个正整数),
它们的和大于等于 x
。
输入
第一行两个整数 N
x
(0 < N <= 100000
,0 <= x <= 10000000
)
第二行有 N
个正整数(每个正整数小于等于 100
)。
输出
输出一个整数,表示所求的个数。
示例一
输入
3 7
3 4 7
输出
4
说明
3+4
4+7
3+4+7
7
这四组数据都是大于等于 7
的,所以答案为 4
示例二
输入
10 10000000
1 2 3 4 5 6 7 8 9 10
输出
0
思路
解题思路:
-
读取输入:
- 首先,程序读取两个整数
N
和x
,其中N
代表数组的长度,x
是我们需要找的连续区间和的最小值。 - 然后,读取并存储包含
N
个正整数的数组nums
。
- 首先,程序读取两个整数
-
遍历数组寻找满足条件的区间:
- 使用两层循环遍历数组。外层循环以数组中的每个元素作为可能的连续子数组的起始点(索引 i)。
- 内层循环计算从当前起始点
i
到后续任意一个位置j
的连续子数组的和(用变量sum
存储)。
-
判断并累加满足条件的区间数:
- 在内层循环中,每当子数组的和
sum
大于等于给定的目标值x
时,说明找到了一个符合条件的连续子数组。 - 此时,我们将满足条件的连续子数组个数(从i到j,从i到j+1,从i到j+2,......,从i到n-1,这些区间都满足,即:
(n-1 )- j+1
个区间)累加到结果变量res
中。 - 找到一个满足条件的子数组后,跳出内层循环,继续检查下一个可能的起始点。
- 在内层循环中,每当子数组的和
-
输出结果:
- 遍历完成后,输出结果变量
res
,它记录了所有满足条件的连续区间的个数。
- 遍历完成后,输出结果变量
通过这种方法,我们可以确保找到所有满足条件的连续子数组,并正确统计其数量。
代码
c
#include <stdio.h>
#include <stdlib.h>
int main() {
// 输入部分:读取数组长度 N 和目标数值 x
int n, x;
scanf("%d %d", &n, &x);
// 初始化一个大小为 N 的数组 nums 来存储输入的正整数
int nums[n];
// 读取并存储 N 个正整数
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
// 初始化结果变量 res,用于记录满足条件的连续区间的个数
int res = 0;
// 外层循环遍历数组中的每个元素作为可能的连续子数组的起始点(索引 i)
for (int i = 0; i < n; i++) {
// 内层循环计算以 i 为起点的连续子数组的和(sum)
int sum = 0;
for (int j = i; j < n; j++) {
// 累加当前元素到 sum 中
sum += nums[j];
// 当子数组和 sum 大于等于目标值 x 时
if (sum >= x) {
// 计算满足条件的连续子数组个数,并累加到 res 中
// 由于子数组是连续的正整数,因此满足条件的子数组个数为剩余元素个数(n - j)
res += n - j;
// 找到一个满足条件的子数组后,跳出内层循环,继续检查下一个起始点
break;
}
}
}
// 输出满足条件的连续子数组个数
printf("%d\n", res);
// 程序执行完毕,返回 0
return 0;
}