66 lines
1.7 KiB
Plaintext

Program Fishing3; {堆结构、贪心}
Type
Data = Record
fish, lake: integer; //堆中结点的信息
End;
Var
heap: Array[1..100] Of Data;
t, f, d: Array[1..100] Of integer;
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 shl 1;
While (j <= k) Do Begin
If (j < k) and (heap[j].fish < heap[j + 1].fish) Then Inc(j);
If a.fish < heap[j].fish Then Begin
heap[i] := heap[j];
i := j;
j := i shl 1;
End
Else Break;
End;
heap[i] := a;
End;
Begin
assign(input,'fishing.in');
assign(output,'fishing.out');
reset(input);
rewrite(output);
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 shr 1 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);
close(input);
close(output)
End.