Fresh Energy

           Nerver say die!

IT博客 首页 新随笔 联系 聚合 管理
  84 Posts :: 0 Stories :: 197 Comments :: 0 Trackbacks

动态规划题。就像那个大富翁游戏里面的接金币一样,问题是,它的时间跨度很大(0 <= T <= 30000 ),肯定不可能用数组记录的,要另想法子。

#include<iostream.h>
#include<stdlib.h>
#include<search.h>
#include <cmath>
int N,K,T;
int max;
struct Gangster{
 int s, p, t;
};
Gangster  g[100];
int best[100];

int compare(const void *a,const void *b)
{
 if( ((Gangster*)a)->t<((Gangster*)b)->t) return -1;
 if( ((Gangster*)a)->t>((Gangster*)b)->t) return 1;
 return 0;
}

int main()
{
 cin>>N>>K>>T;
 for(int i=0;i<N;i++)
  cin>>g[i].t;
 for( i=0;i<N;i++)
  cin>>g[i].p;
 for( i=0;i<N;i++)
  cin>>g[i].s;
 qsort(g,N,sizeof(Gangster),compare);   //对强盗按到达时间排序
 max=0;
 for(i=0;i<N;i++)
 {
  best[i]=-1;
  if(g[i].t>=g[i].s)  best[i]=0;  //若最后一个gangster的位置可移动得到,至少可得财富
  for(int j=0;j<i;j++)
  {
   int dt=g[i].t-g[j].t;
   int ds=abs(g[i].s-g[j].s);
   if((best[j]>best[i])&&(dt>=ds))   //对前j个人的处理的最佳值,且能拿到第i财富
    best[i]=best[j];              //跳过中间j-i之间的盗贼
  }
  if(best[i]>=0) best[i]+=g[i].p;  //取得第i个盗贼的财富
  if(best[i]>max )  max=best[i];
 }//best[i]表示以第i个盗贼为最后顾客能取得的最大财富
 cout<<max;
 return 0;
}

posted on 2006-09-11 10:58 zhouditty 阅读(346) 评论(1)  编辑 收藏 引用 所属分类: ACM

Feedback

# re: pku1036 Gangsters 2006-09-19 01:32 踏雪赤兔
一不小心WA了2次……郁闷>_<  回复  更多评论
  

只有注册用户登录后才能发表评论。