Sleeping Schedule CodeForces

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2010;
int a[N],f[N][N];
int read() {
	int res=0,ch,flag=0;
	if((ch=getchar())=='-')             //判断正负
		flag=1;
	else if(ch>='0'&&ch<='9')           //得到完整的数
		res=ch-'0';
	while((ch=getchar())>='0'&&ch<='9')
		res=res*10+ch-'0';
	return flag?-res:res;
}
int main() {
	int n=read(),h=read(),l=read(),r=read();
	//不睡觉的时间
	for(int i=1; i<=n; i++)
		a[i]=read();
	memset(f,-1,sizeof f);
	for(int i=0; i<h; i++)
		f[0][i]=0;
	//枚举睡觉次数
	for(int i=1; i<=n; i++)
		for(int j=0; j<h; j++) {
			if(f[i-1][j]==-1)
				continue;
			int res;
			//j是醒来的时间
			//res是进入下一次睡眠的时间
			res=(j+a[i]-1)%h;
			f[i][res]=max(f[i][res],f[i-1][j]+(l<=res&&res<=r));
			res=(j+a[i])%h;
			f[i][res]=max(f[i][res],f[i-1][j]+(l<=res&&res<=r));
		}
	int ans=0;
	for(int i=0; i<h; i++)
		ans=max(ans,f[n][i]);
	cout<<ans<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12541953.html