您的位置:首页 > 其它

鱼塘钓鱼(树)

2016-04-08 21:45 357 查看
Description有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表:鱼塘编号1234
5
第1分钟能钓到的鱼的数量(1..1000)10
1420169每过1分钟钓鱼数的减少量(1..100)246
5
3当前鱼塘到下一个相邻鱼塘需要的时间(单位:分钟)3
5
44即:在第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
5

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
:=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转载时必须以链接形式注明原始出处及本声明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: