列表

详情


NC50169. 钓鱼

描述

在一条水平路边,有n个钓鱼湖,从左到右编号为1,2,…,n。佳佳有H个小时的空余时间,他希望利用这个时间钓到更多的鱼。他从1出发,向右走,有选择的在一些湖边停留一定的时间(是5分钟的倍数)钓鱼。最后在某一个湖边结束钓鱼。佳佳从第i个湖到第i+1个湖需要走分钟路,还测出在第i个湖停留,第一个5分钟可以钓到F_i条鱼,以后每再钓5分钟,可以钓到的鱼量减少D_i,若减少后的鱼量小于0,则减少后的鱼量为0。为了简化问题,佳佳假定没有其他人钓鱼,也没有其他因素影响他钓到期望数量的鱼。请编程求出佳佳最多能钓鱼的数量。

输入描述

第一行一个整数n,表示湖的个数

第二行一个整数H,表示佳佳的空闲时间

第三行有n个整数,依次表示每个湖第一个5分钟能钓到鱼的数量

第四行有n个整数,依次表示以后的每5分钟钓鱼数量比前一个5分钟钓鱼数量减少的数量

第五行有n-1个整数,T_i表示由第i个湖到第i+1个湖需要花分钟的路程

输出描述

输出只有一行,表示佳佳最多能钓鱼的数量。

示例1

输入:

3
1
4 5 6
1 2 1
1 2

输出:

35

说明:

在第1个湖钓15分钟,共钓得4+3+2=9条鱼;
在第2个湖钓10分钟,共钓得5+3=8条鱼;
在第3个湖钓20分钟,共钓得6+5+4+3=18条鱼;
从第1个湖到第2个湖,从第2个湖到第3个湖,共用时间15分钟,共得35条鱼,并且这是最多的数量。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 732K, 提交时间: 2020-05-03 09:12:01

#include<bits/stdc++.h>
using namespace std;
int n,x,a[999],b[999],c[999],d[2222][2222]={0},m=0,s,i,j,v,y,l;
int main(){cin>>n>>x;x*=12;
    for(i=1;i<=n;i++)cin>>a[i];for(i=1;i<=n;i++)cin>>b[i];
    for(i=1;i<n;i++)cin>>l,c[i+1]=c[i]+l;
    for(i=1;i<=n;i++){
        for(j=1;j<=x-c[i];j++){d[i][j]=d[i][j-1];
            for(v=0;v<=j;v++){
                if((v-1)*b[i]<a[i]){s=0;
				    for(y=0;y<v;y++)s+=a[i]-(b[i]*y);
                    d[i][j]=max(d[i][j],d[i-1][j-v]+s);
                }
            }m=max(m,d[i][j]);
        }
    }cout<<m;
}

C++ 解法, 执行用时: 306ms, 内存消耗: 2028K, 提交时间: 2021-07-24 20:30:44

#include<bits/stdc++.h>
#define N 105
using namespace std;

int n,H,ans,w[N],c[N],t[N],f[N*10][N][N];

void dfs(int T,int l,int lt,int F)
{
    if(T<0||l>n||f[T][l][lt]>F) return;
    f[T][l][lt]=F,ans=max(ans,F);
    dfs(T-1,l,lt+1,F+w[l]-c[l]*lt);
    dfs(T-t[l+1],l+1,0,F);
}

int main()
{
    scanf("%d%d",&n,&H);
    for(int i=1;i<=n;i++)   scanf("%d",&w[i]);
    for(int i=1;i<=n;i++)   scanf("%d",&c[i]);
    for(int i=2;i<=n;i++)   scanf("%d",&t[i]);
    dfs(H*12,1,0,0);
    printf("%d",ans);
    return 0;
}

上一题