Poj 3061 Subsequence 「 尺取法例1 」

傳送門:http://poj.org/problem?id=3061


解析


就是尺取法的一般性題目了

設置l,r兩個指針,遇到合法區間就停下來記錄答案,並且l++,如果當前區間不合法(sum[ l~r ] < S)就 r++,直到合法爲止

 

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define LL long long
#define N 100006

using namespace std;

inline int wread(){
	char c(getchar ());int wans(0),flag(1);
	while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
	while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
	return wans*=flag;
}


void init (){
	freopen (" ","r",stdin);
	freopen (" ","w",stdout);
}

int T;
int n,m;
int a[N];
LL sum[N];

int main (){
//	init ();
	T=wread();
	while (T--){
		n=wread();m=wread();
		for (int i(1);i<=n;++i)
			a[i]=wread(),sum[i]=sum[i-1]+(LL)a[i];
		int l(1),r(1),ans(0x7f7f7f7f);
		while (r<=n){
			while (sum[r]-sum[l-1]<m  && r<=n) r++;
			if (r>n)	break;
			ans=min (ans,r-l+1);
			if (ans==1)	break;
			l++;
		}
		if(ans==0x7f7f7f7f)	puts("0") ;
		else printf("%d\n",ans);
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章