问题标题: 酷町堂:1024贪心思路

1
0
已解决
赵逸凡
赵逸凡
初级启示者
初级启示者

题目描述 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追加了内容

@王源松 我一开始问了老师,老师没回复我我的思路对不对,我只能在这问了,你跟沈老师说下

 


0
已采纳
康曦
康曦
中级光能
中级光能

思路应该没错,至于动态转移方程。。。

1
赵逸凡
赵逸凡
初级启示者
初级启示者

14:00回答者悬赏30豆

赵逸凡在2020-07-28 12:45:49追加了内容

14:00之前

1
赵逸凡
赵逸凡
初级启示者
初级启示者

@康曦 有了新的思路:(贪心,但不用堆)

枚举每一分钟时间,然后比较剩余时间全部花在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;
}

 

后面懒得写了,我还是听正解吧。。。

1
赵逸凡
赵逸凡
初级启示者
初级启示者

我会随机选一个回答采纳,大家回答下吧

0
0
柯以成
柯以成
新手光能
新手光能

思路应该是对的

别的我不知道

0
沈峻宇
沈峻宇
资深天翼
资深天翼

沈峻宇在2020-07-28 14:36:51追加了内容

恐怖

我要回答