青蛙过河
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 135 测试通过 : 24
总提交 : 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;
}