[P1052]过河

来源:互联网 发布:naza飞控调参软件下载 编辑:程序博客网 时间:2024/05/21 00:53

原题链接

先把代码粘上
具体的之后再写

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MOD 10007#define LL long longusing namespace std;int l,s,t,m,i,j,k,stu[105],ans,vis[10005],f[10005],mat[10005];int main(){    memset(f,127,sizeof(f));    scanf("%d%d%d%d",&l,&s,&t,&m);    for(i=1;i<=m;i++)    {        scanf("%d",&stu[i]);    }    sort(stu+1,stu+m+1);    for(i=1;i<=m;i++)    {        if(s==t)        {            if(stu[i]%t==0) ans++;        }        else         {            if(stu[i]-stu[i-1]>t) mat[i]=(stu[i]-stu[i-1])%t+mat[i-1]+t;            else mat[i]=(stu[i]-stu[i-1])%t+mat[i-1];        }           }    if(s==t)    {        printf("%d",ans);        return 0;    }    f[0]=0;     for(i=1;i<=m;i++)     {        vis[mat[i]]=1;      }    if(l-stu[m]>=t) l=(l-stu[m])%t+mat[m]+t;    else l=(l-stu[m])%t+mat[m];    for(i=1;i<=l+t-1;i++)        for(j=s;j<=t;j++)            if(i-j>=0&&i-j<l)            {                if(vis[i]) f[i]=min(f[i],f[i-j]+1);                else f[i]=min(f[i],f[i-j]);            }    ans=200;        for(i=l;i<=l+t-1;i++) ans=min(ans,f[i]);    printf("%d",ans);    return 0;}