Subsequence
Subsequence
http://www.nowcoder.com/questionTerminal/25cb9f9e23c84730a01bc997d7b94626
题目大意:给定一个长度为n的序列,找出一个最短的子序列使其之和大于等于s
我也就来摸摸鱼,尺取+前缀和
弄一个双指针分别对前缀进行处理
sum[i]代表前i项之和 要求i-j的子序列 只需要sum[j]-sum[i-1]即可
接下来只要运用尺取法 在保证当前子序列之和大于等于s的情况下移动左指针
一旦小于移动右指针,这样就可以比较每个满足的区间
#include <iostream> using namespace std; const int maxn=5e5+7; const int inf=0x3f3f3f3f;///防大数 int a[maxn]; int b[maxn]; int main() { int t; cin>>t; while (t--) { int n,m; cin>>n>>m; for (int i=1;i<=n;++i) { cin>>a[i]; b[i]=b[i-1]+a[i];///前缀 } int l=1; int r=1; int ans=inf; while (r<=n)///边界条件 { if (b[r]-b[l-1]>=m) { ans=min((r-l+1),ans);///比较当前满足的子序列 ++l; } else ++r; } if (ans==inf) cout<<0<<endl; else cout<<ans<<endl; } }