第一種方法 因爲是遞增序列 對於任何一個sum [i] 在 i到n之間二分找一下就可以了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <iostream>
#include <sstream>
#include <ostream>
#include <algorithm>
#include <ctype.h>
#include <cmath>
#include <queue>
#include <vector>
#define inf 1e9+7
#define pi acos(-1)
#define natrule exp(1)
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
int arr[200000];
int sum[200000];
int main(){
int t;
cin>>t;
while(t--){
int n,kk;
cin>>n>>kk;
for(int i=1;i<=n;i++){
cin>>arr[i];
sum[i]=arr[i]+sum[i-1];
}
int res=inf;
for(int i=1;sum[i]+kk<=sum[n];i++){
int len=(int)(lower_bound(sum+i,sum+n+1,sum[i]+kk)-sum-i);
res=min(res,len);
}
if(res==inf) cout<<0<<endl;
else
cout<<res<<endl;
}
return 0;
}
第二種方法 :尺取 (看的挑戰 )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <iostream>
#include <sstream>
#include <ostream>
#include <algorithm>
#include <ctype.h>
#include <cmath>
#include <queue>
#include <vector>
#define inf 1e9+7
#define pi acos(-1)
#define natrule exp(1)
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
int arr[200000];
int sum[200000];
int main(){
int t;
cin>>t;
while(t--)
{
int n,kk;
cin>>n>>kk;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
int res=inf;
int s,end,all;
s=end=all=0;
for(;;)
{
while(end<n&&all<kk)
{
all+=arr[end++];
}
if(all<kk) break;
res=min(res,end-s);
all-=arr[s++];
}
if(res==inf) cout<<0<<endl;
else cout<<res<<endl;
}
return 0;
}
tips 對於區間上的操作最好是左閉右開從零開始 stl也是這個樣子實現