5 条题解

  • 2
    @ 2025-11-16 1:09:53
    #include <stdio.h>
    #define N 100005
    int main() {
    	int t;
    	scanf("%d", &t);
    	while (t--) {
    		long long n, l, r;
    		scanf("%lld %lld %lld", &n, &l, &r);
    		long long pre[N] = {0};          //定义前缀和数组
    		for (int i = 1; i <= n; ++i) {
    			scanf("%lld", &pre[i]);
    			pre[i] += pre[i - 1];
    		}
    		long long ans = 0;
    		int start = 0;
    		for (int end = 1; end <= n; ++end) {
    			while (start < end && pre[end] - pre[start] > r) {
    				start++;
    			}
    			if (start < end && pre[end] - pre[start] >= l) {
    				ans++;
    				start = end;
    			}
    		}
    		printf("%lld\n", ans);
    	}
    	return 0;
    }
    
    • @ 2025-11-16 17:17:31

      用前缀和来判断哪一段在l~r范围里,在的话ans++不在的话递推

  • 1
    @ 2025-11-17 20:42:46
    #include<stdio.h>
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            long long n,l,r,a[100009]={0},b[100009]={0},ans=0;
            scanf("%lld%lld%lld",&n,&l,&r);
            for(int i=1;i<=n;i++){
                scanf("%lld",&a[i]);
                b[i]=a[i]+b[i-1];
            }
            int start=0,end=1;
            for(;end<=n;end++){
                while(start<end&&b[end]-b[start]>r){
                    start++;
                }
                if(b[end]-b[start]<=r&&b[end]-b[start]>=l){
                    ans++;start=end;
                }
            }
            printf("%lld\n",ans);
        }
    }//不知道为什么只能用前缀和才能过
    
    • 1
      @ 2025-11-17 10:42:36

      我叶梓楣也要成为duck大魔王!!!(2)

      这道题的话 就是给我们一些数字嘛 然后按照这个数字的顺序 我们去考虑 最多有多少个符合的区间 那我们最贪心的去想肯定是只要满足 我们就重新开一个区间嘛 所以我们就想到了 我们用双指针 去维护 如果大于r了 就左指针右移 缩小一点 如果小于l 那就右指针移动 扩大一点 然后就可以了 双指针还是挺常用的一种思想吧 大家多做题 就会有些感觉 比如 这道题 维护一个[l,r]的区间 维护区间 我们就想到会不会是双指针

      #include <bits/stdc++.h>
       using namespace std;
       #define int long long
       #define endl '\n'
       #define EPS 1e-8
       #define fi first
       #define se second
       #define lowbit(x) x & (-x)
       const int inf = 0x3f3f3f3f;
       typedef pair<int, int> pii;
       const int N = 2E5 + 10;
       int arr[N];
       void solve()
       {
           int n, l, r;
           cin >> n >> l >> r;
           int vec[n+1]={0};
           for (int i = 1; i <= n; i++)
           {
               cin >> vec[i];
           }
           int ll = 0, rr = 0;
           int ans = 0, sum = 0;
           while (ll <= n && rr <= n)
           {
               if (sum <= r && sum >= l)
               {
       ​
                   ans++;
                   ll = rr + 1;
                   sum = 0;
               }
               else if (sum < l)
               {
                   rr++;
                   sum += vec[rr];
               }
               else if (sum > r)
               {
       ​
                   sum -= vec[ll];
                   ll++;
               }
           }
           cout << ans << endl;
       }
       signed main()
       {
           ios::sync_with_stdio(false);
           cin.tie(0);
           cout.tie(0);
           int t = 1;
           cin >> t;
           while (t--)
           {
               solve();
           }
           return 0;
       }
       ​
      
      • 1
        @ 2025-11-16 23:39:14
        #include <bits/stdc++.h>
        using namespace std;
        #define int long long
        #define endl '\n'
        #define EPS 1e-8
        #define fi first
        #define se second
        #define lowbit(x) x & (-x)
        const int inf = 0x3f3f3f3f;
        typedef pair<int, int> pii;
        const int N = 2E5 + 10;
        int arr[N];
        void solve()
        {
            int n, l, r;
            cin >> n >> l >> r;
            int vec[n+1]={0};
            for (int i = 1; i <= n; i++)
            {
                cin >> vec[i];
            }
            int ll = 0, rr = 0;
            int ans = 0, sum = 0;
            while (ll <= n && rr <= n)
            {
                if (sum <= r && sum >= l)
                {
        
                    ans++;
                    ll = rr + 1;
                    sum = 0;
                }
                else if (sum < l)
                {
                    rr++;
                    sum += vec[rr];
                }
                else if (sum > r)
                {
        
                    sum -= vec[ll];
                    ll++;
                }
            }
            cout << ans << endl;
        }
        signed main()
        {
            ios::sync_with_stdio(false);
            cin.tie(0);
            cout.tie(0);
            int t = 1;
            cin >> t;
            while (t--)
            {
                solve();
            }
            return 0;
        }
        
        • @ 2025-11-16 23:39:57

          双指针模拟

      • 1
        @ 2025-11-16 14:55:40

        #include<iostream> #include<algorithm> using namespace std; #define ll long long

        int main() { ios::sync_with_stdio(0);

        cin.tie(0);

        cout.tie(0);

        int t,n,l,r;

        cin>>t;

        while(t--){

        cin>>n>>l>>r;

        ll a[n+10],b[n+10]={0},ans=0;

        for(int i=1;i<=n;i++){

        cin>>a[i];

        if(a[i]>r){

        b[i]=0;//标记超出范围的数

        continue;

        }

        b[i]=1;

        }

        for(int i=1;i<=n;i++){

        if(b[i]==0){

        continue;

        }

        if(b[i]==1){

        if(a[i]>=l){

        ans++;

        }

        if(a[i]<l){

        int sum=a[i];

        for(int j=i+1;j<=n;j++){//依次相加判断

        if(b[j]==0){

        break;

        }

        if(b[j]==1){

        sum+=a[j];

        if(sum>=l&&sum<=r){

        ans++;

        for(int l=i+1;l<=j;l++){

        b[l]=0;//取过的牌标记防止再用

        }

        break;

        }

        if(sum>r){

        break;

        }

        if(sum<l){

        continue;

        }

        }

        }

        }

        }

        }

        cout<<ans<<"\n";

        }

        return 0;

        }

        • 1

        我叶梓楣也要成为duck大魔王!!!(2)

        信息

        ID
        1206
        时间
        1000ms
        内存
        256MiB
        难度
        8
        标签
        (无)
        递交数
        167
        已通过
        20
        上传者