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)