美味佳肴题解

美味菜肴

https://ac.nowcoder.com/acm/problem/14704

题意:就是N个菜品,m个菜品种类,T可以做菜的总时间。j对应菜品的编号,每个食物素材具有不新鲜度b,美味值a和做菜所需要的时间c。
食物美味值=a_i-tb_i,求T时刻,最大美味值为多少?
题解,首先我们可以举例(i<j),假设先做第i个菜在做第j个菜>先做第j个菜再做第i个菜
如图化解,图片说明
是不是我们就可以先以Ci和bj,Cj和bi来比较,从小到大排序来搞呢,然后是不是有点像01背包,只不过他的贡献是我们的a_i-t
b_i,对吧,别犹豫,直接搞他啊,对了,初始化dp[0]=0,其他-INF。奥里给,造他就完了。

#include <bits/stdc++.h>
#define fio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define debug(x) cout << #x << ": " << x << endl;
#define debug1(x) cout<<"xxx"<<endl;
#define ll long long
#define ull unsigned long long
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#define mse(a,b) memset(a,b,sizeof a);
using namespace std;
const int maxx=1e6+100;
const int mod=1e9+7;
int b[maxx];
struct node
{
    int a,b,c;
    bool operator <(const node& pp){
    return c*pp.b<pp.c*b;
    }
};
ll dp[maxx];
node ans[maxx];
int main()
{
    fio;
    int n,m,t;
    cin>>n>>m>>t;
    for(int i=1;i<=n;i++)
        cin>>b[i];
    for(int i=1;i<=m;i++)
    {
        int j;
        cin>>j>>ans[i].a>>ans[i].c;
        ans[i].b=b[j];
    }
    sort(ans+1,ans+1+m);
    mse(dp,-0x3f3f3f);
    dp[0]=0;
    for(int i=1;i<=m;i++)
        for(int j=t;j>=ans[i].c;j--)
        dp[j]=max(dp[j],dp[j-ans[i].c]+ans[i].a-j*ans[i].b);
    cout<<*max_element(dp+1,dp+1+t)<<'\n';
    return 0;
}
全部评论

相关推荐

11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
10-30 10:16
南京大学 Java
龚至诚:给南大✌️跪了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务