はなたの日記

ギターのコードについて書きます

DSL_3_A The Smallest Window I

問題
The Smallest Window | Sliding Window | Aizu Online Judge

smallest windowを求める問題です。なんじゃそりゃって感じですね。
どうやら尺取り法というアルゴリズムが良いらしいです。初めましてのアルゴリズムだったので、調べました。
考え方はこちらのサイトを参考にしました。確かに区間の動かし方が尺取り虫みたいですね。
尺取り法 | 健忘症の備忘録

久しぶりにC言語でやってみました。

#include<stdio.h>
#define LARGE 100001
#define MIN(a,b) ((a) < (b) ? (a) : (b))

int getAns(int a[],int n,int s){
	int i=0,j=0;
	int sum=0;
	int ans=LARGE;
	
	for(i=1;i<=n;i++){
		sum+=a[i-1];
		if(sum >= s){
			ans=MIN(i-j,ans);
			while(sum >= s){
				sum-=a[j];
				j++;
				if(sum >= s)
					ans=MIN(i-j,ans);
			}
			
		}
	}
	
	if(ans==LARGE)
		ans=0;
	
	return ans;
}


int main(){
	int a[LARGE];
	int n,s;
	int ans=0;
	
	scanf("%d %d",&n,&s);
	
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);

	printf("%d\n",getAns(a,n,s));
	
	return 0;
	
}

iは幅の右端、jは幅の左端という感じです。半開区間を採用しているので、iは1~nになっています。