P5365 [SNOI2017]英雄联盟 题解

原题链接

简要题意:

长度为 n 的序列 a,初始均为 0. 可以花 Ci 的代价使 aiai+1. 求最少花多少代价能使 aim(其中不计 ai=0 的积)。

n200,Ci125,Ki10,m1017.

个人觉得其实可以先算一下代价的最大值。

很显然代价最大值为 CiKi,也就是 2.5×105 左右。

于是背包 dp 应运而生。

很显然,令 fi,j 表示前 i 个数,换 j 的代价所能达到的最大乘积(除 0). 则很容易得到

fi,j=max(fi1,j,maxk=1Kifi1,jkcik)

时间复杂度:O(nCiKi),非常稳。

空间可能会爆,那就滚动数组,把 i 这一维省掉。但要注意倒序枚举。

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

typedef long long ll;
const int N = 3e5 + 1;
const int M = 2e2 + 1;

int n; ll m;
int K[M], c[M];
ll f[N];

int main() {
	scanf("%d %lld",&n,&m);
	for(int i = 1; i <= n; i++) scanf("%d", K + i);
	for(int i = 1; i <= n; i++) scanf("%d", c + i);
	f[0] = 1;
	for(int i = 1; i <= n; i++)
	for(int j = N - 1; j > 0; j--)
	for(int k = 1; k <= K[i] && k * c[i] <= j; k++)
		f[j] = max(f[j], 1ll * f[j - k * c[i]] * k);

	for(int i = 1; i < N; i++)	
		if(f[i] >= m) return printf("%d\n",i), 0;
}
posted @   bifanwen  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示