P1052 过河

 

P1052 过河

 

题意:给个长度为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);
}

 

posted @ 2019-08-06 14:45  paranoid。  阅读(102)  评论(0编辑  收藏  举报