比赛描述
输入
第一行为河宽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; }