摇钱树

题目

题目描述
Cpg 正在游览一个梦中之城,在这个城市中有 nn 棵摇钱树。这下,可让 Cpg 看傻了。可是 Cpg 只能在这个城市中呆 kk 天,但是现在摇钱树已经成熟了,每天每棵都会掉下不同的金币(不属于 Cpg!)。Cpg 每天可以砍掉其中一颗,并获得其树上所有的金币(怎么会有这种好事)。请你帮助 Cpg 算出他在这 kk 天中最多能获得多少金币。

输入格式
本题单测试点内有多组数据。

每个测试点中有不超过 1010 组的测试数据。

每组测试数据:

第一行两个整数 n,kn,k。

第二行包含 nn 个整数 m_im
i

,表示 Cpg 刚看到这 nn 棵树时每刻树上的金币数。

第三行 nn 个整数 b_ib
i

,表示每颗摇钱树,每天将会掉落的金币。

以 0 0 结束。

输出格式
对每组测试数据,输出仅一行,Cpg 在 kk 天中能获得的最大金币数。

输入输出样例
输入 #1复制
3 3
10 20 30
4 5 6
4 3
20 30 40 50
2 7 6 5
0 0
输出 #1复制
47
104
说明/提示
数据范围与约定
对于 100%100% 的数据,1 \le k \le n \le 10^31≤k≤n≤10
3
,1 \le m_i \le 10^51≤m
i

≤10
5
,1 \le b_i \le 10^31≤b
i

≤10
3

思路

我们先思考,很明显若只选1棵树,那就选价值最大的,若要选多棵树,则要先选消耗最大的(不一定价值最大)。为什么呢?假设我们有3棵树且要选全部,每棵价值和每次消耗分别为m1,m2,m3;b1,b2,b3;则总价值=m1+m2+m3-k1b1-k2b2-k3b3,其中k为第几次选-1,很明显消耗的大的系数要小,即消耗大的要先取。以此我们可以推及到n棵树选k棵的情况(明显就是dp了嘛),先按消耗从大到小贪心排序,这样去取肯定保证最优,然后考虑dp,设f[i][j]表示前i棵树选j棵得到的最大值,则很容易得到状态转移方程:f[i][j]=max(f[i-1][j],f[i-1][j-1]+max(0,m[i]-b[i](j-1))) 。

代码

#include <bits/stdc++.h>

#define MAXN 1010
#define ll long long

using namespace std;

int n, k, ans;

struct node {
	int m, b;
}a[MAXN];

bool cmp(node x, node y) {
	return x.b > y.b;
}

int f[MAXN];

int main() {
	scanf("%d%d", &n, &k);
	while (n || k) {
		k = min(k, n);
		memset(f, 0, sizeof(f));
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i].m);
		}
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i].b);
		}
		sort(a + 1, a + n + 1, cmp);
		for (int i = 1; i <= n; i++) {
			for (int j = k; j >= 1; j--) {
				int num = a[i].m - a[i].b * (j - 1);
				if (num < 0) num = 0;
//				f[i][j] = max(f[i - 1][j], f[i - 1][j - 1] + num);
				f[j] = max(f[j], f[j - 1] + num);
			}
		}
		ans = 0;
//		for (int i = 1; i <= k; i++) ans = max(ans, f[n][i]);
		for (int i = 1; i <= k; i++) ans = max(ans, f[i]);
		cout << ans << endl;	
		scanf("%d%d", &n, &k);
	}
	return 0;
}
Webpack树摇(Tree Shaking)是一种在Webpack中进行性能优化的手段,它通过静态分析和模块依赖关系来消除无用的代,从而减少最终打包文件的体积。树摇会通过识别并删除未被使用的模块、函数、变量等,以达到优化代的目的。 虽然Webpack从2.x版本开始原生支持树摇功能,但由于JavaScript的动态特性和模块的复杂性限制,直到最新的5.0版本,树摇仍然存在一些问题,使得优化效果可能不如预期。因此,开发者需要有意识地优化代结构,或者使用一些补丁技术来帮助Webpack更精确地检测无效代,完成树摇操作。一个常见的优化操作是避免无意义的赋值,以减少无用代的产生。[3.1] 总结来说,Webpack树摇是一种通过静态分析和模块依赖关系来消除无用代的性能优化手段,它可以帮助减少最终打包文件的体积,提升网页加载速度。但在实际使用中,需要注意JavaScript的动态特性和复杂的模块结构可能会对树摇效果造成影响,需要开发者有意识地进行代优化和使用辅助技术来实现更精确的树摇操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Webpack 原理系列九:Tree-Shaking 实现原理](https://blog.csdn.net/zjjcchina/article/details/121159109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [webpack中的tree shaking(树摇)-----移除未使用的代](https://blog.csdn.net/qq_41869212/article/details/128396960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值