首页 > 其他分享 >POJ3061 Subsequence

POJ3061 Subsequence

时间:2022-11-09 00:13:28浏览次数:43  
标签:.. int sum Subsequence len +---+---+---+---+---+---+ POJ3061 include

思路: 尺取法

注意本题目中所有的内容全部是证书, 这就为我们维护了一个很好的单调性. 考虑最暴力的\(\mathcal O(n^3)\)的做法, 就是枚举起点, 终点, 然后分别求和. 但是我们可以做的好一点.

假设现在我们有这样的一个情况:

+---+---+---+---+---+---+
^l          ^r
   sum[l..r]<S

但是

+---+---+---+---+---+---+
^l              ^r
    sum[l..r]<S

那么下一次, \(r\)不用往右移了. \(l\)只要往右移一位, \(l\)不用变就行了. 因为这样做相当于构建一个子区间, 维护了单调性, 那么就可以做了.

+---+---+---+---+---+---+
    ^l          ^r
      sum[l..r]?

Code

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAXN 100005
#define F(i, a, b) for(int i=a; i<=b;i++)
#define Fd(i, a, b) for(int i=a;i>=b;i--)

int n, s, a[MAXN];
void solve(){
	memset(a, 0, sizeof a);
	cin>>n>>s;
	F(i, 1, n) cin>>a[i];
	int len = 1145141;
	int r = 0, sum =0;
	for(int l=1;l<=n;l++){
		while(r<=n && sum <s){
			r++; sum += a[r];
		}
		if(sum >= s){
			len = min(len, r-l+1);
		}
		sum -= a[l];
	}
	if(len == 1145141) cout<<"0\n";
	else cout<<len<<"\n";
}
int main(){
	cin.tie(NULL);
	int T; cin>>T; while(T--) solve();
	return 0;
}

标签:..,int,sum,Subsequence,len,+---+---+---+---+---+---+,POJ3061,include
From: https://www.cnblogs.com/augpath/p/16871760.html

相关文章