连续区间和大于等于某个数(弱化版)

题目描述::

给你一个数组a(长度<=1e6)和整数m,要求有多少个连续区间和大于等于m;

输入描述::

第一行两个整数  c,m 分别表示数组大小和m

第二行 c个数组元素,0<c[i]<1e5;

输出描述::

一个整数表示所求的个数

思路分析::

假设区间 l~r 满足要求,当你再找寻合法区间是,要麽 l 右移 要麽 r 右移,这样就跟明显了

代码:复杂度  O(n)

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define pii pair<int,int>
 4 using namespace std;
 5 const int maxn=1e6+5;
 6 int c[maxn];
 7 
 8 int main()
 9 {
10     int n,m;
11     scanf("%d%d",&n,&m);
12     for(int i=1;i<=n;i++){
13         scanf("%d",&c[i]);
14     }
15     ll sum=0,ans=0;
16     int j=1;
17     for(int i=1;i<=n;i++){
18         sum+=c[i];
19         if(sum>=m){
20             ans+=(n-i+1);
21             while(j<=i){
22                 sum-=c[j];
23                 if(sum>=m){
24                     ans+=(n-i+1);
25                     j++;
26                 }
27                 else{
28                     break;
29                 }
30             }
31         }
32     }
33     printf("%lld\n",ans);
34     return 0;
35 }

 

posted @ 2019-12-09 15:08  sj-_-js  阅读(732)  评论(0编辑  收藏  举报