记录编号 334019 评测结果 AAAAAAAAAA
题目名称 [NOIP 2005]过河 最终得分 100
用户昵称 Gravatardududu 是否通过 通过
代码语言 C++ 运行时间 0.311 s
提交时间 2016-10-31 17:41:05 内存使用 57.54 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define KN 5000010
#define LL long long
int pos[KN];
int L,S,T,M,mod;
int v[KN];
int f[KN];

void special_sol(){
	
	int cnt=0;
	for(int i=1;i<=M;i++){
		if(!(pos[i]%S)) cnt++;
	}
	printf("%d",cnt);
}

void sol(){
	
	memset(f,0x3f,sizeof f);
	
	f[0]=0;

	int pre_pos;
	for(int i=1;i<=L;i++){
		for(int j=S;j<=T;j++){
			pre_pos=i-j;
			if(pre_pos<0) break;
			f[i]=min(f[i],f[pre_pos]+v[i]);	
		}
	}
	
	printf("%d",f[L]);
}

void init(){
	
	scanf("%d%d%d%d",&L,&S,&T,&M);
	
	for(int i=1;i<=M;i++) scanf("%d",&pos[i]);
	sort(pos+1,pos+M+1);
	
	if(S==T){
		special_sol();
		return;
	}
	
	mod=90;
	
	int tmp;
	for(int i=1;i<=M;i++){
		tmp=pos[i]-pos[i-1];
		pos[i]=pos[i-1]+tmp%mod;
	}
	L=pos[M]+(L-pos[M])%mod;
	
	for(int i=1;i<=M;i++) v[pos[i]]=1;
	
	sol();
}



int main(){
	freopen("river.in","r",stdin);
	freopen("river.out","w",stdout);
	init();
	return 0;
}