尺取(板子)
阿新 • • 發佈:2020-11-15
描述 給出了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; } }