题意:给个长度为1e9的桥,青蛙从0开始每次能跳[s,t]的距离,给m个石头在桥上,求青蛙最少踩几个石头。
思路:因为m<100,l>1e9,所以可以对桥进行压缩,因为s,t属于[1,10],所以步数的最小公倍数是2520,如果两个石头时间距离大于2520,可以对石头之间的距离进行压缩,因为青蛙肯定会跳一个2520的距离。
#include<bits/stdc++.h>
using namespace std;
int a[150];
int book[2520*150];
int f[2520*150];
int d[105];
int main()
{
int l,s,t,m;
scanf("%d%d%d%d",&l,&s,&t,&m);
for(int i=1; i<=m; i++)
scanf("%d",&a[i]);
sort(a+1,a+1+m);
for(int i=1; i<=m; i++)
{
if((a[i]-a[i-1])>2520)
{
int temp=(a[i]-a[i-1])/2520;
a[i]=a[i]-2520*temp;
}
book[a[i]]=1;
}
memset(f,0x3f,sizeof(f));
f[0]=0;
int len=a[m]+t;
for(int i=1; i<=len; i++)
for(int j=s; j<=t; j++)
if(i-j>=0)
f[i]=min(f[i],f[i-j]+book[i]);
int ans=0x3f3f3f3f;
for(int i=len-t; i<=len; i++)
ans=min(ans,f[i]);
printf("%d",ans);
}