记录编号 458480 评测结果 AAAAAAAAAA
题目名称 [NOIP 2005]过河 最终得分 100
用户昵称 GravatarFFF团 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2017-10-11 14:41:42 内存使用 0.37 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int stone[105],f[10105];
bool rock[10105];
int L,S,T,M,ans=101;
int main(){
	freopen("river.in","r",stdin);
	freopen("river.out","w",stdout);
	
	scanf("%d",&L);
	scanf("%d%d%d",&S,&T,&M);
	int D=T*(T-1),x=0;
	for(int i=1;i<=M;i++)scanf("%d",&stone[i]);	
	if(S==T){
		ans=0;
		for(int i=1;i<=M;i++)
		if(stone[i]%S==0)ans++;
		printf("%d",ans);
		return 0;
	}
	stone[M+1]=L;
	sort(stone+1,stone+M+1);
	for(int i=1;i<=M+1;i++){
		if(stone[i]-stone[i-1]>D)
		x+=stone[i]-stone[i-1]-D;
		rock[stone[i]-x]=1;
	}
	L-=x;
	rock[L]=0;
	memset(f,0x7f,sizeof(f));
	f[0]=0;
	for(int i=S;i<=L+T;i++)
	for(int k=S;k<=T;k++)
	if(i-k>=S||i-k==0){
		if(!rock[i])f[i]=min(f[i-k],f[i]);
		else f[i]=min(f[i-k],f[i])+1;
	}
	for(int i=L;i<L+T;i++)
	ans=min(f[i],ans);
	printf("%d",ans);
	return 0; 
}