钓鱼

【题目描述】
话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼,但是,因为还要准备2013NOIP,z老师只给了他H(1<=H<=24)个小时的空余时间,假设有N(2<=n<=100)个鱼塘都在一条水平路边,从左边到右编号为1、2、3、。。。、n)。VIP是个很讲究效率的孩子,他希望用这些时间钓到尽量多的鱼。他从湖1出发,向右走,有选择的在一些湖边停留一定的时间钓鱼,最后在某一个湖边结束钓鱼。他测出从第I个湖到I+1个湖需要走5*ti分钟的路,还测出在第I个湖边停留,第一个5分钟可以钓到鱼fi,以后再每钓5分钟鱼,鱼量减少di。为了简化问题,他假定没有其他人钓鱼,也不会有其他因素影响他钓到期望数量的鱼。请编程求出能钓最多鱼的数量。
【输入格式】
第一行:湖的数量n。
第二行:时间h(小时)。
第三行:n个数,f1,f2,…fn。
第四行:n个数,d1,d2,….dn。
第五行:n-1个数,t1,t2,….tn-1
【输出格式】
一个数,所能钓鱼的最大数量。
【样例输入】
2
1
10 1
2 5
2
【样例输出】
31
【分析】
首先确定VIP999不可能走回头路,因为这样还不如走过去之前就钓。
设f[i]表示前i个鱼塘能钓到最多的鱼数。

var
  t,f,f1,d:array[0..1001]of longint;
    i,j,k,n,ti,h,ans,p,s:longint;
begin
  read(n);
    read(h);
    h:=h*12;
    for i:=1 to n do read(f[i]);
    for i:=1 to n do read(d[i]);
    for i:=1 to n-1 do read(t[i]);
    ans:=-1;
    for i:=1 to n do begin
      f1:=f;
      h:=h-t[i-1];
        s:=0;
        for j:=1 to h do begin
          ti:=-maxlongint;
            for k:=1 to i do
              if f1[k]>ti then begin
                  ti:=f1[k];
                    p:=k;
                end;
            s:=s+f1[p];
            f1[p]:=f1[p]-d[p];
            if f1[p]<0 then f1[p]:=0;
        end;
        if s>ans then ans:=s;
    end;
    write(ans);
end.
posted @ 2016-12-20 22:52  JRX2015U43  阅读(162)  评论(0编辑  收藏  举报