钓鱼
时间限制: 1 Sec 内存限制: 128 MB
题目描述
约翰是个垂钓谜,星期天他决定外出钓鱼h小时(1≤h≤16),约翰家附近共有n个池塘(2≤n≤25),这些池塘分布在一条直线上,约翰将这些池塘按离家的距离编上号,依次为L1,L2,…,Ln,约翰家门外就是第一个池塘,所以他到第一个池塘是不用花时间的,约翰可以任选若干个池塘垂钓,并且在每个池塘他都可以呆上任意长的时间,但呆的时间必须为5分钟的倍数,(5分钟为一个单位时间),已知从池塘Li到池塘Li+1要化去约翰ti个单位时间,每个池塘的上鱼率预先也是已知的,池塘Li在第一个单位时间内能钓到的鱼为Fi(0≤Fi≤100),并且每过一个单位时间在单位时间内能钓到的鱼将减少一个常数di(0≤di≤100),现在请你编一个程序计算约翰最多能钓到多少鱼。
输入
第一行为一个整数n,第二行为一个整数h,第三行为n个用空格隔开的整数,表示Fi(i=1,2,…,n),第四行为n个用空格隔开的整数,表示di(i=1,2,…,n),第五行为n-1个用空格隔开的整数,表示ti(i=1,2,…,n-1)
输出
输出一个整数,表示约翰最多能钓到的鱼的数量。
样例输入
2
1
10 1
2 5
2
样例输出
31
题解
这道题有贪心或DP的两种写法,思想都是一样的
每次枚举到第i个池塘,然后找最大能钓的值
找最大值:用一个数组w维护住所有池塘现在能钓的鱼的值,每次取最大,至时间结束或都为0
贪心写法
var
h,n,max,maxn,time,jj,linshi:longint;
i,j,k,l:longint;
w,f,d,t:array[0..25]of longint;
begin
readln(n);
readln(h); h:=h*12;
for i:=1 to n do
read(f[i]);
for i:=1 to n do
read(d[i]);
t[1]:=0;
for i:=2 to n do
begin
read(t[i]);
inc(t[i],t[i-1]);
end;
max:=-1;
for i:=1 to n do
w[i]:=f[i];
for i:=1 to n do
begin
time:=h-t[i]; linshi:=0;
for l:=time downto 1 do
begin
maxn:=-1;
for j:=1 to i do
if w[j]>maxn
then begin maxn:=w[j]; jj:=j; end;
if maxn=0 then break;
inc(linshi,maxn);
if w[jj]-d[jj]<0
then w[jj]:=0
else dec(w[jj],d[jj]);
end;
if linshi>max then max:=linshi;
for k:=1 to i do
w[k]:=f[k];
end;
writeln(max);
end.