农场大亨-美团2023笔试(codefun2000)

题目链接
农场大亨-美团2023笔试(codefun2000)

题目内容

塔子哥是一个喜欢种田类的游戏的人,他觉得这样的游戏可以让他体验到农民的乐趣,同时也可以锻炼他的经营能力。他最近在玩一个叫做“农场大亨”的游戏,这个游戏的目的是在有限的时间内赚尽可能多的钱。游戏中有 n 种作物,每种作物都有自己的特点,比如生长周期、种子成本、作物收益等。塔子哥需要根据这些信息,合理地安排自己的种植计划,以达到最大化利润的目标。塔子哥只有一块土地,也就是说每个时间只能由一个作物在生长。他需要在游戏开始时购买种子,然后种植在土地上。种子的买入价格为 ai,作物卖出价格 bi。一个种子只会产出一个作物,种子可以重复购买。第 i 种作物从种植到作物成熟采摘需要 ti天时间,种植和采摘、卖出等操作不耗时间,成熟之前作物没有价值。如果塔子哥想要更换作物,他需要先把当前作物采摘卖出,然后再购买新的种子。
游戏内总时长为 m 天,也就是说塔子哥只有 m 天的时间来经营自己的农场。塔子哥初始的钱足够多,不用担心资金不足。塔子哥想知道,在这样的条件下,他最多能赚多少钱。

输入描述

第一行两个整数 n , m (1≤n,m≤1000) 表示作物种类数和游戏时长;
第二行 n 个正整数,表示每种作物的成熟时长 𝑡𝑖​ (1≤ti ≤m);
第三行 n 个正整数,表示每种作物的种子价格 𝑎𝑖 (1≤ai≤100000);
第四行 n 个正整数,表示每种作物的卖出价格 𝑏𝑖 (ai≤bi≤100000) 。

输出描述

输出一个整数来表示塔子哥最多能赚的钱。

样例1

输入

3 12
3 4 7
9 3 2
11 6 11

输出

12

样例1解释

赚钱最多的方案是先种一个第二种作物,然后种一个第三种作物,耗时
4+7=11 天,赚的钱数为
6−3+11−2=12 ,可以证明这是最优的方案。

样例2

输入

10 100
81 21 66 63 48 25 23 88 71 65
56 12 94 57 57 6 37 63 87 64
62 68 99 93 88 96 47 65 97 69

输出

360

题解1

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

const int N = 1005;

int n, m, t[N], a[N], b[N], dp[N];

int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) scanf("%d", &t[i]);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
	
	// 由于同一个种子可以重复购买,因此本题可以理解成完全背包来做,将总时长m看做背包容量,
	// 种子从种植到采摘的时间t看成物品体积,卖出价格与买入价格之差看成价值
	// 即在背包容量为m的情况下,所能得到的最大价值是多少 
	for(int i = 1; i <= n; i++){
		for(int j = t[i]; j <= m; j++){
			dp[j] = max(dp[j], dp[j - t[i]] + (b[i] - a[i]));
		}
	}
	printf("%d\n", dp[m]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值