P8548 小挖的买花

小挖的买花

题目背景

小挖喜欢买花,但是 ta 太懒了!所以这个任务全权交给了你。

题目描述

花店里只有 n 株花,每一株花都有三个属性:价格 costi、美丽度 bei、新鲜程度 fri

小挖每次都有不同的要求。准确来说,对于第 j 次买花,你手里的钱至多能买下总价为 cj 的花。同时,小挖还要求购买花的新鲜程度总和大于等于 fj。而小挖希望知道,在满足 ta 给出的条件后,购买花的美丽度总和的最大值是多少?

小挖一共要让你买 q 次花,你能否正确回答 ta 的问题呢?

询问显然彼此独立。

输入格式

1 行,共两个数 n,q

2n+1 行,每行三个数 costi,fri,bei,分别表示一株花的三个属性。

n+2n+q+1 行,每行两个数 cj,fj ,表示每次买花时的要求。

输出格式

q 行,每行一个数,表示美丽度总和的最大值。

样例 #1

样例输入 #1

5 1
2 4 5
4 3 3
1 3 2
3 4 3
3 2 5
10 10

样例输出 #1

15

提示

对于 20% 的数据,3n,q16

对于 40% 的数据,3n,q30,0cj,fj50

对于 60% 的数据,3n100,1q5×104,0costi,fri,cj,fj100

对于另外 20% 的数据,对于每次买花,都有 fj=0

对于 100% 的数据,3n500,1q106,0costi,fri,cj,fj500,1bei106

注意事项

  1. 要用scanf,printf否则会TLE
  2. 要更新m1,m2,不能直接开500否则会TLE
  3. 注意不用long long!!

代码

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