鱼塘钓鱼(树)

来源:互联网 发布:淘宝卖家怎么做活动 编辑:程序博客网 时间:2024/06/11 20:54

Description

有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 


鱼塘编号 











第1分钟能钓到的鱼的数量(1..1000) 

10 

14 

20 

16 



每过1分钟钓鱼数的减少量(1..100) 











当前鱼塘到下一个相邻鱼塘需要的时间(单位:分钟) 










即:在第1个鱼塘中钓鱼第1分钟可钓到10条鱼,第2分钟只能钓到8条鱼,……,第5分钟以后再也钓不到鱼了。从第1个鱼塘到第2个鱼塘需要3分钟,从第2个鱼塘到第3个鱼塘需要5分钟,…… 

给出一个截止时间T(T<1000),设计一个钓鱼方案,从第1个鱼塘出发,希望能钓到最多的鱼。 

假设能钓到鱼的数量仅和已钓鱼的次数有关,且每次钓鱼的时间都是整数分钟。 

Input

输入文件fishing.in共5行,分别表示: 

第1行为N; 

第2行为第1分钟各个鱼塘能钓到的鱼的数量,每个数据之间用空格隔开; 

第3行为每过1分钟各个鱼塘钓鱼数的减少量,每个数据之间用空格隔开; 

第4行为当前鱼塘到下一个相邻鱼塘需要的时间; 

第5行为截止时间T; 

Output

输出文件fishing.out仅一个整数(不超过maxlongint),表示你的方案能钓到的最多的鱼。 

Sample Input

 

10 14 20 16 9 
2 4 6 5 3 
3 5 4 4 
14

 

Sample Output

 

76


解题思路:用堆和贪心的方法,先把各项数据读入并存储在数组里面,然后开始枚举最远走到的池塘编号,收集能够钓鱼的池塘的资料,接着把堆初始化,并用贪心选取鱼最多的池塘,最后输出最优解即可。


程序:
type
  data=record
         fish,lake:longint;
       end;
var
  heap:array[1..100]of data;
  t,f,d:array[1..100]of longint;
  ans,i,j,k,m,max,n,t1,time:longint;

procedure sift(i:longint);
  var
    a:data;
    j:longint;
  begin
    a:=heap[i];
    j:=i*2;
    while j<=k do
      begin
        if (j
        if a.fish
          else break;
      end;
    heap[i]:=a;
end;

begin
  readln(n);
  for i:=1 to n do
    read(f[i]);
  readln;
  for i:=1 to n do
    read(d[i]);
  readln;
  for i:=1 to n-1 do
    read(t[i]);
  t[n]:=0;
  readln;
  readln(m);
  t1:=0;
  max:=0;
  for k:=1 to n do
    begin
      time:=m-t1;
      ans:=0;
      for i:=1 to k do
        begin
          heap[i].fish:=f[i];
          heap[i].lake:=i;
        end;
      for i:=1 to k div 2 do
        sift(i);
      while (time>0) and (heap[1].fish>0) do
        begin
          inc(ans,heap[1].fish);
          dec(heap[1].fish,d[heap[1].lake]);
          sift(1);
          dec(time);
        end;
      if ans>max then max:=ans;
      inc(t1,t[k]);
    end;
  writeln(max);
end.


版权属于: Chris
原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0pq.html
转载时必须以链接形式注明原始出处及本声明。
0 0