小M给你一串含有c个正整数的数组, 想让你帮忙求出有多少个下标的连续区间, 它们的和大于等于x。
小M给你一串含有c个正整数的数组, 想让你帮忙求出有多少个下标的连续区间, 它们的和大于等于x。
第一行两个整数c x(0 < c <= 1000000, 0 <= x <= 100000000)
第二行有c个正整数(每个正整数小于等于100)。
输出一个整数,表示所求的个数。
3 6 2 4 7
4
对于有3个整数构成的数组而言,总共有6个下标连续的区间,他们的和分别为:
2 = 2
4 = 4
7 = 7
2 + 4 = 6
4 + 7 = 11
2 + 4 + 7 = 13
其中有4个和大于等于6,所以答案等于4。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int c,x,res=0;
cin>>c>>x;
int a[c];
for(int i=0;i<c;i++)
cin>>a[i];
long long ans=0,sum=0,j=0;
for(int i=0;i<c;i++)
{
sum+=a[i];
if(sum>=x)
{
ans+=(c-i);
while(j<=i)
{
sum-=a[j];
j++;
if(sum>=x)
ans+=(c-i);
else
break;
}
}
}
cout<<ans<<endl;
return 0;
}
#include <cinttypes>
#include <cstdio>
#define MAX_N 1000005
// input
int nums[MAX_N];
int_fast64_t sumN(int n) {
if (n % 2) {
return (n + 1) / 2 * (int_fast64_t)n;
}
return (int_fast64_t)n / 2 * (n + 1);
}
int_fast64_t solve(int n, int limit) {
if (limit == 0) {
return sumN(n);
}
int_fast64_t ans = 0;
int curSum = 0;
for (int i = 0, j = 0; i < n && j <= n; curSum -= nums[i++]) {
while (curSum < limit && j < n) {
curSum += nums[j++];
}
if (curSum >= limit) {
ans += n - j + 1;
}
}
return ans;
}
int main() {
int n, limit;
scanf("%d%d", &n, &limit);
for (int i = 0; i < n; ++i) {
scanf("%d", nums + i);
}
printf("%" PRIdFAST64 "\n", solve(n, limit));
return 0;
} #include <queue>
#include <iostream>
using namespace std;
int main()
{
long long sum = 0;
int c, x;
cin >> c >> x;
long long re = 0;
queue<int> range;
int v;
for (int i = 0; i < c; ++i) {
cin >> v;
range.push(v);
sum += v;
while (sum >= x) {
re += (c - i);
sum -= range.front();
range.pop();
}
}
cout << re << endl;
return 0;
} 其实没有必要保存数组,毕竟每次删除的都是最左边的,直接上queue即可。
"""" 正整数数组,sum(a[i:j])>x,则sum(a[i:j+k])都大于x,j+k<=n,k为满足条件的个数 使用滑动窗口优化 """ if __name__ == "__main__": n, x = map(int, input().strip().split()) a = list(map(int, input().strip().split())) i, j, t_sum, ans = 0, 0, 0, 0 while True: while j < n and t_sum < x: t_sum += a[j] j += 1 if j == n and t_sum < x: break ans += n - j + 1 t_sum -= a[i] i += 1 print(ans)
#include <bits/stdc++.h>
using namespace std;
int main(){
int c,x;
cin>>c>>x;
int a[c];
for(int i=0;i<c;i++)
cin>>a[i];
long sum=0,t=0;
for(int i=0,j=0;i<c;i++){
for(;j<c && t<x;j++)
t += a[j];
if(j==c && t<x)
break;
sum += c-j+1;
t -= a[i];
}
cout<<sum<<endl;
return 0;
} import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] params = br.readLine().trim().split(" ");
int c = Integer.parseInt(params[0]), x = Integer.parseInt(params[1]);
params = br.readLine().trim().split(" ");
int[] arr = new int[c];
for(int i = 0; i < c; i++) arr[i] = Integer.parseInt(params[i]);
long sum = 0, count = 0;
int j = 0;
for(int i = 0; i < c; i++) {
sum += arr[i];
while(sum >= x && j <= i){
count += c - i;
sum -= arr[j];
j ++;
}
}
System.out.println(count);
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int c = sc.nextInt();
int x = sc.nextInt();
int[] arr = new int[c];
for(int i = 0; i < c; i++){
arr[i] = sc.nextInt();
}
System.out.println(intervalNums(arr, x));
}
private static long intervalNums(int[] arr, int x){
// 这里要用long记录,否则只能a45%
long res = 0;
int left = 0, right = 0;
long sum = arr[left];
while(left < arr.length){
// 符合条件则左指针移动,同时sum减去窗口左端值
if(sum >= x){
res += arr.length - right;
sum -= arr[left];
left++;
}else{
// 不符合则右指针向右移动扩大窗口,同时sum加上当前窗口右端值
// 当窗口右端到达数组末尾则不能扩大。因为窗口都开到最大还不符合,所以可以直接退出
right++;
if(right == arr.length){
break;
}
sum += arr[right];
}
}
return res;
}
} #include <stdio.h>
#include <stdlib.h>
int n, a[1000005];
long long x;
int main() {
scanf("%d%lld", &n, &x);
long long sum = 0, count = 0;
int j = 1;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
sum += a[i];
while (sum >= x) {
count += n - i + 1;
sum -= a[j];
j++;
}
}
printf("%lld\n", count);
return 0;
}
#include<stdio.h>
int main (void)
{
int c,x;
int arr[1000000]={0};
scanf("%d %d",&c,&x);
for(int i=0;i<c;i++)
scanf("%d",&arr[i]);
long long count=0;
int left=0;
int right=0;
int sum=arr[0];
while(right<c)
{
if(sum>=x)
{
count+=(c-right);
sum-=arr[left++];
}else{
sum+=arr[++right];
}
}
printf("%ld\n",count);
return 0;
} #include <iostream>
using namespace std;
int nums[1000001];
int main(int argc, char* argv[]){
int c, x, a;
cin >> c >> x;
for(int i = 0; i < c; i++) cin >> nums[i];
int low = 0, high = 0, sum = 0;
long long cnt = 0;
while(high < c){
while(high < c && sum < x) sum += nums[high++];
while(sum >= x) {
cnt += (c - high + 1);
sum -= nums[low++];
}
}
cout << cnt << endl;
return 0;
} #include<iostream>
(720)#include<vector>
using namespace std;
int main(void){
int c, x;
cin>>c>>x;
int num;
vector<int> v;
long long ans = 0;
int sum = 0;
for (int i = 0; i < c; i++){
cin>>num;
v.push_back(num);
}
int i = 0;
for (int j = 0; j < c; j++){
sum += v[j];
while (sum >= x){
ans += c - j;
sum -= v[i];
i++;
}
}
cout<<ans<<endl;
return 0;
} let num = readline().split(' ');
let length = parseInt(num[0]);
let x = parseInt(num[1]);
let arr = readline().split(' ');
let sum = 0;
let qur = 0;
for (let i = 0; i < length; i++) {
for (let j = i; j < length; j++) {
sum += arr[j];
if (sum >= x) {
qur += length - j;
break;
}
}
sum = 0;
}
print(qur);