Poj 3061 Subsequence 「 尺取法例1 」

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/violinlove/article/details/83111687

传送门: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;
}

猜你喜欢

转载自blog.csdn.net/violinlove/article/details/83111687
今日推荐