题目
给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。
题目输入
第一行两个整数N x(0 < N <= 100000, 0 <= x <= 10000000)
第二行有N个正整数(每个正整数小于等于100)。
题目输出
输出一个整数,表示所求的个数。
注意:此题对效率有要求,暴力解法通过率不高,请考虑高效的实现方式。
实例
输入 | 3 7 |
输出 | 4 |
说明 | 第一行的3表示第二行数组输入3个数,第一行的7是比较数,用于判断连续数组是否大于该数;组合为 3 + 4; 3 + 4 + 7; 4 + 7; 7; 都大于等于指定的7;所以共四组。 |
输入 | 9 200 |
输出 | 0 |
说明 | 所有元素的和小于200,所以返回0。 |
题目解析
题目
题目代码
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n,x;
cin >> n >> x;
vector<int> nums(n, 0);
for(int i = 0; i < n; i++){
cin >> nums[i];
}
//双指针
int sum = 0;//和
int left = 0;
int ans = 0;//统计结果
for(int i = 0; i < n; i++){
sum += nums[i];
while(sum >= x){
ans += n - i;//如果满足,以后的组合全满足,这时就需要移动left
sum -= nums[left];
left--;
}
}
cout << ans <<endl;
return 0;
}