题目描述
给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。
输入描述
第一行两个整数N x(0 < N <= 100000, 0 <= x <= 10000000)
第二行有N个正整数(每个正整数小于等于100)。
输出描述
输出一个整数,表示所求的个数。
用例1
输入
3 7
3 4 7
输出
4
第一行的3表示第二行数组输入3个数,第一行的7是比较数,用于判断连续数组是否大于该数;组合为 3 + 4; 3 + 4 + 7; 4 + 7; 7; 都大于等于指定的7;所以共四组.
用例2
输入
10 10000
1 2 3 4 5 6 7 8 9 10
输出
0
所有元素的和小于10000,所以返回0。
C++
#include <iostream>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
int nums[n];
for (int i = 0; i < n; i++) cin >> nums[i];
int left = 0; // 滑动窗口的左端点
int right = 0; // 滑动窗口的右端点
int count = 0; // 记录连续区间个数
int sum = 0; // 记录当前区间的和
while (right < n) {
sum += nums[right];
while (sum >= x) {
// 如果当前区间和大于等于x,那么以left为起点的所有连续区间都符合要求
count += n - right;
sum -= nums[left];
left++;
}
right++;
}
cout << count << endl;
return 0;
}
javaScript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let n = 0;
let x = 0;
let nums = [];
rl.on('line', (line) => {
if (!n) {
[n, x] = line.trim().split(' ').map(Number);
} else {
nums = line.trim().split(' ').map(Number);
let left = 0; // 滑动窗口的左端点
let right = 0; // 滑动窗口的右端点
let count = 0; // 记录连续区间个数
let sum = 0; // 记录当前区间的和
while (right < n) {
sum += nums[right];
while (sum >= x) {
// 如果当前区间和大于等于x,那么以left为起点的所有连续区间都符合要求
count += n - right;
sum -= nums[left];
left++;
}
right++;
}
console.log(count);
}
});
python
import sys
n, x = map(int, sys.stdin.readline().split())
nums = list(map(int, sys.stdin.readline().split()))
left = 0
right = 0
count = 0
sum = 0
while right < n:
sum += nums[right]
while sum >= x:
count += n - right
sum -= nums[left]
left += 1
right += 1
print(count)
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int x = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) nums[i] = scanner.nextInt();
int left = 0; // 滑动窗口的左端点
int right = 0; // 滑动窗口的右端点
int count = 0; // 记录连续区间个数
int sum = 0; // 记录当前区间的和
while (right < n) {
sum += nums[right];
while (sum >= x) {
// 如果当前区间和大于等于x,那么以left为起点的所有连续区间都符合要求
count += n - right;
sum -= nums[left];
left++;
}
right++;
}
System.out.println(count);
}
}