初级启示者
题目描述 Description
有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼,第2分钟内只能钓到8条鱼,……,第5分钟以后再也钓不到鱼了。从第1个鱼塘到第2个鱼塘需要3分钟,从第2个鱼塘到第3个鱼塘需要5分钟,……
给出一个截止时间T(T<1000),设计一个钓鱼方案,从第1个鱼塘出发,希望能钓到最多的鱼。
假设能钓到鱼的数量仅和已钓鱼的次数有关,且每次钓鱼的时间都是整数分钟。
输入描述 Input Description
第1行为N;
第2行为第1分钟各个鱼塘能钓到的鱼的数量,每个数据之间用一空格隔开;
第3行为每过1分钟各个鱼塘钓鱼数的减少量,每个数据之间用一空格隔开;
第4行为当前鱼塘到下一个相邻鱼塘需要的时间;
第5行为截止时间T;
输出描述 Output Description
输出文件仅一个整数(不超过2^31-1),表示你的方案能钓到的最多的鱼。
样例输入 Sample Input
5
10 14 20 16 9
2 4 6 5 3
3 5 4 4
14
样例输出 Sample Output
76
贪心思路是不是“时间T内,只在第i个鱼塘钓鱼,考虑时间减少”的最多钓鱼数目来考虑选择前往鱼塘的路线?但是怎么考虑路线的长度问题?
我的思路:f[i][j]表示“从时间T内,第i个鱼塘到第j个鱼塘能钓到的鱼的最大数目”,总目标是f[1][n],边界是f[i][i]=Σv[i] (1<=T,v[i]=a[i]-(T-i)*b[i],T是总时间,v[i]是第i分钟能钓到的鱼的最大数目,a[i]是题目要求输入的第二行,b[i]是题目要求输入的第三行),动态转移方程是f[i][j]=max(f[i][k],f[k+1][j])(i<=k<=j)
其他都确定好了,但是动态转移方程还不确定 /kel
还有,怎么用堆来做(贪心思想?)
赵逸凡在2020-07-28 14:34:37追加了内容
@王源松 我一开始问了老师,老师没回复我我的思路对不对,我只能在这问了,你跟沈老师说下
初级启示者
@康曦 有了新的思路:(贪心,但不用堆)
枚举每一分钟时间,然后比较剩余时间全部花在i鱼塘钓鱼所钓的鱼多还是相邻鱼塘钓鱼所钓的鱼多(考虑距离),选择能钓鱼多的地方,继续枚举判断
#include<iostream>
using namespace std;
int n,t,tree_can[110],less[110],dis[110];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>tree_can[i]>>less[i]>>dis[i];
cin>>t;
int begin=1;
for(int i=1;i<=t;i++)
{
if(begin==1)
{
if(tree_can[begin]-less[begin]*i<=0)
begin=2;
else
{
int a=tree_can[begin]-less[begin]*i,b=less[begin],c=t-i,d=0;
while(a>0&&c>0)
{
d+=a;
a-=b;
if(a>0)c--;
}
}
}
}
return 0;
}
后面懒得写了,我还是听正解吧。。。