列表

详情


MMT7. 连续子区间和

描述

M给你一串含有c个正整数的数组, 想让你帮忙求出有多少个下标的连续区间, 它们的和大于等于x

输入描述

第一行两个整数c x(0 < c <= 1000000, 0 <= x <= 100000000)

第二行有c个正整数(每个正整数小于等于100)。

输出描述

输出一个整数,表示所求的个数。

示例1

输入:

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。

原站题解

C++ 解法, 执行用时: 35ms, 内存消耗: 4344KB, 提交时间: 2020-11-05

#include<bits/stdc++.h>
using namespace std;
#define maxn 1234567
int n,m,k;
long long ans,ansk,sum;
inline int readi()
{	char x;	int a=0;	bool w=0;	x=getchar();
	while(x<'0'||x>'9')
	{	if(x=='-') w=1;	x=getchar();		}
		while(x>='0'&&x<='9')
	{	a=a*10+x-'0';		x=getchar();	}
	return w?-a:a;	}
int a[maxn],x,cnt;
int main()
{
	cin>>n>>k;
	//cout<<k;
	for(int i=1;i<=n;i++)
	{
		x=readi();
		a[i]=x;
		//cout<<a[i]<<" ";
	}
	//cout<<endl;
	cnt=1;
		for(int i=1;i<=n;i++)
		{
			sum+=a[i];
		//	if(ans>k) ansk++;
			while(sum>=k)
			{
			sum-=a[cnt++];
	         ansk+=n-i+1;
			}
		}
		cout<<ansk;
}

C++ 解法, 执行用时: 57ms, 内存消耗: 7416KB, 提交时间: 2020-07-28

#include <bits/stdc++.h>
using namespace std;
 int main(){
    int c,x;
    ios::sync_with_stdio(false); cin.tie(0);
    while(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;
}

C++ 解法, 执行用时: 67ms, 内存消耗: 7520KB, 提交时间: 2020-06-30

#include <bits/stdc++.h>
using namespace std;
 int main(){
    int c,x;
    ios::sync_with_stdio(false); cin.tie(0);
    while(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;
}

C++ 解法, 执行用时: 72ms, 内存消耗: 4324KB, 提交时间: 2021-11-15

// #include <bits/stdc++.h>
// using namespace std;
// int main()
// {
//     long long c,x,t,n,count=0;
//     vector<int> arr;
//     cin>>c>>x;
//     n=c;
//     while(n--)
//     {
//         cin>>t;
//         arr.emplace_back(t);
//     }
//     for(int i = 0; i<c; i++)
//     {
//         int sum = arr[i];
//         int j = i+1;
//         while(j<c&&sum<x)
//         {
//             sum+=arr[j];
//             j++;
//         }
//         if(sum>=x)
//         {
//             count+=c-j+1;
//         }
//         else
//             continue;
//     }
//     cout<<count<<endl;
//     return 0;
// }
#include "bits/stdc++.h"
using namespace std;
const int maxn=1e6+100;
typedef long long LL;
int n,a[maxn];
LL x;
int main()
{
    scanf("%d%lld",&n,&x);
    LL sum=0,ans=0;
    int j=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
        if(sum>=x){
            ans+=n-i+1;
            while(j<=i&&sum>=x){
                sum-=a[j];
                j++;
                if(sum>=x) ans+=n-i+1;
                else break;
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}

C++ 解法, 执行用时: 77ms, 内存消耗: 4348KB, 提交时间: 2020-10-31

#include "bits/stdc++.h"
using namespace std;
const int maxn=1e6+100;
typedef long long LL;
int n,a[maxn];
LL x;
int main()
{
    scanf("%d%lld",&n,&x);
    LL sum=0,ans=0;
    int j=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
        if(sum>=x){
            ans+=n-i+1;
            while(j<=i&&sum>=x){
                sum-=a[j];
                j++;
                if(sum>=x) ans+=n-i+1;
                else break;
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}

上一题