题意 给定一个长度为n的数组和一个值m,求最短的子序列和大于m
思路 尺取,感觉就是双指针,维护双指针间的区间和,大于等于m是左端往前进一位 复杂度O(2*n).
#include<iostream> using namespace std; int a[100000010]; int main() { int t; cin>>t; while(t--) { int n,x; long long ans=1e18,sum=0; cin>>n>>x; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1,j=1;i<=n;i++) { while(sum<x&&j<=n) { sum+=a[j]; j++; } if(sum>=x) ans=min(ans,(long long)(j-i)); sum-=a[i]; } if(ans!=1e18) cout<<ans<<endl; else cout<<0<<endl; } }