二分法时间复杂度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; }