poj3061-subsequence

二分法时间复杂度O(nlogn)

尺取法时间复杂度O(n)

#include <iostream>  
#include <algorithm>  
using namespace std;  
  
#define N 100010  
int arr[N+10];  
//int sum[N+10];  
  
int main()  
{   //二分法  
    /*int cases; 
    int n, s; 
    cin>>cases; 
    while (cases--) { 
        cin>>n>>s; 
        for (int i=0; i<n; i++) { 
            cin>>arr[i]; 
        } 
        for (int i=0; i<n; i++) { 
            sum[i+1]=sum[i]+arr[i]; 
        } 
        if (sum[n]<s) { 
            printf("0
"); 
            continue; 
        } 
        int res=n; 
        for (int i=1; sum[i]+s<=sum[n]; i++) { 
            int t =lower_bound(sum+i, sum+n, sum[i]+s)-sum; 
            res=minn(res, t-i); 
        } 
        cout<<res<<'
'; 
    } 
    */  
    //尺取法  
    int cases;  
    int n, s;  
    int res;  
    int i, j, sum;  
    cin>>cases;  
    while (cases--) {  
        cin>>n>>s;  
        for (int i=0; i<n; i++) {  
            cin>>arr[i];  
        }  
        res=n+1;  
        i=j=sum=0;  
        for (;;) {  
            while (i<n&&sum<s) {  
                sum+=arr[i++];  
            }  
            if (sum<s) break;  
            res=min(res, i-j);  
            sum-=arr[j++];  
        }  
        if (res>n) res=0;  
        cout<<res<<'
';  
    }  
    return 0;  
}  

  

原文地址:https://www.cnblogs.com/summernight/p/8535038.html