南邮 OJ 1410 青蛙过河

青蛙过河

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 135            测试通过 : 24 

比赛描述

一条宽度为L的小河上漂浮着一些荷叶,青蛙要踩着这些荷叶过河。由于河宽和青蛙一次跳过的距离都是正整数,我们可以把青蛙可能到达的点看成数轴上的一串整点:0,1,…,L(其中L是河宽)。坐标为0的点位于河的一侧,坐标为L的点位于河的另一侧。青蛙从坐标为0的点开始,不停地向坐标为L的点的方向跳跃。一次跳跃的距离是s到t之间的任意正整数(包括s,t)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经越过河了。

输入

第一行为河宽L(1≤L≤10^9),第2行为青蛙跳跃的距离范围s,t(1≤s≤t≤10)和荷叶片数m(1≤m≤100),第3行为m个正整数,依次给出河中各片荷叶的位置(保证起点和终点处没有荷叶)。

输出

青蛙要想过河最少需要踩到的荷叶数。

样例输入

10
2 3 5
2 3 5 6 7

样例输出

2

提示

 

题目来源

JSOI2010



/* AC 4MS Internet
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAX_N 102
#define MAX_STEP 40
using namespace std;

int a[MAX_N],f[MAX_N*MAX_STEP],sz[MAX_N*MAX_STEP];

int main(){
	int l,s,t,m;
	memset(f,127,sizeof(f));
	cin>>l>>s>>t>>m;
	for(int i=1;i<=m;i++)
	   cin>>a[i];    
	if(s==t){//s=t单独讨论,否则会WA3
		int ans=0;
		for(int i=1;i<=m;i++){
			if(a[i]%s==0)ans++;
		}
		cout<<ans;
		return 0;
	}
	sort(a,a+m+1);
	a[m+1]=l;
	for(int i=0;i<=m;i++){
		a[i+1]=a[i]+(a[i+1]-a[i])%MAX_STEP;//压缩路径
	}
	for(int i=1;i<=m;i++){
		sz[a[i]]=1;
	}
	for(int i=s;i<=t;i++){
		if(sz[i]){
			f[i]=1;
		}else{
			f[i]=0;
		}
	}
	for(int i=2*s;i<=a[m+1];i++){
		for(int j=s;j<=t;j++){
			if(j>i){
				break;
			}
			f[i]=min(f[i-j],f[i]);
		}
		if(sz[i])f[i]++;
	} 
	cout<<f[a[m+1]]<<endl;
}
*/


#include<iostream>
#include<algorithm>
#include<cstring>
#define MAX_N 102
#define MAX_STEP 40
using namespace std;

int a[MAX_N],f[MAX_N*MAX_STEP],sz[MAX_N*MAX_STEP];

int main(){
	int l,s,t,m;
	memset(f,127,sizeof(f));
	cin>>l>>s>>t>>m;
	for(int i=1;i<=m;i++)
	   cin>>a[i];    
	if(s==t){//s=t单独讨论,否则会WA3 为什么?
		int ans=0;
		for(int i=1;i<=m;i++){
			if(a[i]%s==0)ans++;
		}
		cout<<ans;
		return 0;
	}
	sort(a,a+m+1);
	a[m+1]=l;
	for(int i=0;i<=m;i++){
		a[i+1]=a[i]+(a[i+1]-a[i])%MAX_STEP;//压缩路径  MAX_STEP为什么不是t,写成 t 同样WA?
	}
	for(int i=1;i<=m;i++){
		sz[a[i]]=1;
	}
	for(int i=s;i<=t;i++){
		if(sz[i]){
			f[i]=1;
		}else{
			f[i]=0;
		}
	}
	for(int i=2*s;i<=a[m+1];i++){
		for(int j=s;j<=t;j++){
			if(j>i){
				break;
			}
			f[i]=min(f[i-j],f[i]);
		}
		if(sz[i])f[i]++;
	} 
	cout<<f[a[m+1]]<<endl;
}






你可能感兴趣的:(ACM,青蛙过河,南邮OJ)