列表

详情


NC14704. 美味菜肴

描述

小明是个大厨,早上起来他开始一天的工作。他所在的餐厅每天早上都会买好  件食材(每种食材的数量可以视为无限),小明从到达餐厅开始就连续工作  时间。每道菜肴的制作需要特定的一种食材以及一段时间,但是食材一旦放久就不新鲜了,菜的美味值会降低。第  道菜肴有三个属性  是该菜肴的美味值,是该菜肴所选食材不新鲜的速率,如果在第  时刻完成第  道菜则美味值为:,完成这道菜需要  的时间。小明希望在这  时间内能做出菜肴使得总美味值最大,所以小明求助于你。


输入描述

第1行输入三个整数  ,分别代表食材种类,菜肴种类和工作时间。
第2行输入  个整数 ,代表第  个食材不新鲜的速率。
接下来的m行,每行输入三个整数,分别代表第  道菜肴需要的食材编号,菜肴的美味值,完成时间。
数据保证:,其他值均,美味值必须通过完整做出菜肴得到,数据保证在规定时间内至少能完整做出1道菜肴。

输出描述

输出一行,一个整数,表示最大总美味值。

示例1

输入:

1 1 74
2
1 502 47

输出:

408

示例2

输入:

2 2 10
2 1
1 100 8
2 50 3

输出:

84

原站题解

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

C++14(g++5.4) 解法, 执行用时: 16ms, 内存消耗: 8292K, 提交时间: 2020-06-18 08:33:18

using namespace std;
#include <bits/stdc++.h>
#define int long long
int s[55];
struct node {
	int id,a,c;
	bool operator < (const node p) const
	{
		return s[p.id]*c<s[id]*p.c;
	}
}mp[55];
int dp[1000005];
signed main (void)
{
	int n,m,t;
	cin>>n>>m>>t;
	for (int i=1;i<=n;i++)
	    cin>>s[i];
	for (int i=0;i<m;i++)
	    cin>>mp[i].id>>mp[i].a>>mp[i].c;
	sort (mp,mp+m);
	memset (dp,-0x3f,sizeof dp);
	dp[0]=0;int ans=-1e18;
	for (int i=0;i<m;i++)
	{
		for (int j=t;j>=mp[i].c;j--)
		{
			dp[j]=max(dp[j],dp[j-mp[i].c]+mp[i].a-s[mp[i].id]*j);
			ans=max(ans,dp[j]);
		}
	}
	cout<<ans<<'\n';
}

C++ 解法, 执行用时: 9ms, 内存消耗: 1172K, 提交时间: 2022-03-18 00:00:03

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,t;
struct ee
{
	ll a,b,c;
}e[60];
ll d[60];
ll dp[1000010];
bool cmp(ee a,ee b)
{
	return d[a.a]*b.c>d[b.a]*a.c;
}
int main()
{
	cin>>n>>m>>t;
	ll i,j,ans=-(ll)1e18;
	fill(dp+1,dp+1+t,-(ll)1e18);
	dp[0]=0;
	for (i=1;i<=n;i++) cin>>d[i];
	for (i=1;i<=m;i++) cin>>e[i].a>>e[i].b>>e[i].c;
	sort(e+1,e+1+m,cmp);
	for (i=1;i<=m;i++)
	{
		for (j=t;j>=e[i].c;j--)
		{
			dp[j]=max(dp[j],dp[j-e[i].c]+e[i].b-d[e[i].a]*j);
			ans=max(ans,dp[j]);
		}
	}
	cout<<ans<<endl;
	return 0;
}

pypy3 解法, 执行用时: 152ms, 内存消耗: 38484K, 提交时间: 2021-06-01 15:14:54

import math

n, m, T = inputs = map(int, input().split())
b = list(map(int, input().split()))
a = []
for _ in range(m):
	j, x, y = map(int, input().split())
	a.append((b[j - 1], x, y))
a.sort(key=lambda x: x[2] / x[0])
ans = -math.inf
dp = [-math.inf] * (T + 1)
dp[0] = 0
for x, y, z in a:
	for t in range(T, z - 1, -1):
		dp[t] = max(dp[t], dp[t - z] + y - t * x)
		ans = max(ans, dp[t])
print(ans)

上一题