vijos 1002
假设两块石头之间最多能跳了x次t。
最少跳s*x,最多跳t*x。
如果t*x-s*x>=9,一定可以跳到下一块石头前t块中的任意一块。
注意要排除掉s=t的情况,不然会T两个点。
#include<cstdio> #include<cctype> #include<algorithm> using namespace std; int read(){ char c; while(!isdigit(c=getchar())); int x=c-'0'; while(isdigit(c=getchar())) x=x*10+c-'0'; return x; } int st[102],f[100001],dp[100001]; int main(){ int l=read(),s=read(),t=read(),m=read(); for(int i=1;i<=m;i+=1) st[i]=read(); sort(st+1,st+m+1); if(s==t){ int ans=0; for(int i=1;i<=m;i+=1) if(st[i]%s==0) ans++; printf("%d",ans); return 0; } int p=9%(t-s)? (9/(t-s)+1)*t:9/(t-s)*t; int j=0; for(int i=1;i<=m;i+=1) if(st[i]-st[i-1]>=p){j+=p; f[j]=1;} else j+=st[i]-st[i-1],f[j]=1; dp[0]=f[0]; for(int i=1;i<=j+p;i+=1){ dp[i]=2e9; for(int j=s;j<=t;j+=1) if(i-j>=0) dp[i]=min(dp[i-j]+f[i],dp[i]); } printf("%d",dp[j+p]); return 0; }