题目描述
Tisfy: 这是一道数学题?
给你长度为n的数组a和一个正整数k,问你a有多少个和大于等于k 的连续子序列。
输入格式
第一行空格隔开的两个正整数,分别代表数组长度和要大于的数。
第二行n nn个空格隔开的正整数,代表数组a aa。
输入格式如下:
n k
a1 a2 ... an
输出格式
输出一行一个正整数代表数组a的和大于等于k的连续子序列的个数。
输入样例
4 10
6 1 2 7
输出样例
2
数据范围与提示
样例一中,
a [ 1..4 ]的和为6 + 1 + 2 + 7 = 16 ≥ 10
a [ 2..4 ] 的和为1 + 2 + 7 = 10 ≥ 10
分析:序列长度为n,若在下标序列区间[l-r]的连续子序列之和大于等于k,则说明右区间从r到n-1的连续子序列都满足序列和大于等于k,即有(n-r)个满足条件;
因此,我们可以循环枚举l从1到n,对于一个给定的l,找出最小的r使得∑ [ l , r ] ≥ k ,那么从l开始的符合条件的连续子序列的个数就是n − r + 1。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<climits>
#include<map>
#include<set>
#include<queue>
#include<cmath>
typedef long long ll;
using namespace std;
ll n, k;
ll a[100001];
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int l = 0, r = 0;
ll sum = a[0], count = 0;
while (r < n) {
if (sum >= k) { //先判断sum
count += n - r;
sum -= a[l++];
}
else {
sum += a[++r];
}
}
cout << count;
}