1. 程式人生 > 實用技巧 >尺取(板子)

尺取(板子)

傳送門

時限:1000MS 記憶體限制:65536K
提交總數:34708 接受:14379

描述

給出了N個正整數(10 <N <100 000)的序列,每個正整數均小於或等於10000,並給出了一個正整數S(S <100 000 000)。編寫程式以查詢該序列的連續元素的子序列的最小長度,其總和大於或等於S。

輸入項

第一行是測試用例的數量。對於每個測試用例,程式必須從第一行讀取數字N和S,並以一個間隔將其隔開。序列號在測試用例的第二行中給出,以間隔分隔。輸入將以檔案結尾結束。

輸出量

對於每種情況,程式都必須將結果列印在輸出檔案的單獨一行上。如果沒有答案,則列印0。

樣本輸入

2
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5

樣本輸出

2
3

#include<iostream>
#include<algorithm>
#include<cstring> 
using namespace std;
const int maxn=1e5+100; 
int a[maxn];
int n,m;
int main(){
    int t;
    cin>>t;
    while(t--){
        memset(a,0,sizeof(a));
        cin
>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } int l=1,r=1; int sum=0; int ans=1e9; while(1){ while(r<=n&&sum<m){//先找到一個合適的區間 sum+=a[r]; r++; }
if(sum<m){//先判斷再更新結果 break; } ans = min(ans,r-l); //如果陣列中都加完了之後還是小於sum,就不用再迴圈了 sum-=a[l]; l++; } if(ans>n){ ans=0; } cout<<ans<<endl; } }