MMT7. 连续子区间和
描述
小M给你一串含有c个正整数的数组, 想让你帮忙求出有多少个下标的连续区间, 它们的和大于等于x。
输入描述
第一行两个整数c x(0 < c <= 1000000, 0 <= x <= 100000000)输出描述
输出一个整数,表示所求的个数。示例1
输入:
3 6 2 4 7
输出:
4
说明:
对于有3个整数构成的数组而言,总共有6个下标连续的区间,他们的和分别为: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; }