心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
如果两个点之间的距离大于t^2,就另他们之间的距离为t^2。如果s!=t,且距离大于t^2,一定存在一种走法,可以从前一个点走到下一个点。
以下是我的代码:
#include<stdio.h>
#include
<string.h>
#define maxm 107
#define maxl 15007
#define INF 2000007
#define min(a,b) (a<b?a:b)
long l,s,t,m,pos[maxm],d[maxl];
bool a[maxl];
void swap(long &a,long &b)
{
    
long t=a;a=b;b=t;
}
void Qsort(long *a,long begin,long end)
{
    
long i=begin,j=end,mid=a[(begin+end)/2];
    
do{
         
while(a[i]<mid) i++;
         
while(a[j]>mid) j--;
         
if(i<=j)
         {
            swap(a[i],a[j]);
            i
++;j--;
         }
    }
while(i<=j);
    
if(begin<j) Qsort(a,begin,j);
    
if(i<end)   Qsort(a,i,end);
}
int main()
{
    
/*
    freopen("river.in","r",stdin);
    freopen("river.out","w",stdout);
    //
*/
    scanf(
"%ld%ld%ld%ld",&l,&s,&t,&m);
    pos[
0]=0;
    
for(long i=1;i<=m;i++)
      scanf(
"%ld",&pos[i]);
    
if(s==t)
    {
       
long ans=0;
       
for(long i=1;i<=m;i++)
         
if(pos[i]%s==0)
           ans
++;
       printf(
"%ld\n",ans);
       
return 0;
    }
    Qsort(pos,
0,m);
    memset(a,
false,sizeof(a));
    
for(long i=1;i<=m;i++)
    {
       
if(pos[i]-pos[i-1]>=t*t)
       {
          
long tmp=pos[i]-(pos[i-1]+t*t);
          pos[i]
=pos[i-1]+t*t;
          
for(long j=i+1;j<=m;j++)
            pos[j]
-=tmp;
       }
       a[pos[i]]
=true;
    }
    l
=pos[m]+t*t;
    
for(long i=1;i<=l;i++) d[i]=INF;
    d[
0]=0;
    
for(long i=s;i<=l;i++)
      
for(long j=s;j<=t;j++)
        d[i]
=min(d[i],d[i-j]+a[i]);
    printf(
"%ld\n",d[l]);
return 0;
}


posted on 2010-03-08 19:40 lee1r 阅读(268) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:动态规划

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理