zoukankan      html  css  js  c++  java
  • 洛谷1417 烹调方案

    题目背景

    由于你的帮助,火星只遭受了最小的损失。但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星。不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~

    gw还是会做饭的,于是拿出了储藏的食物准备填饱肚子。gw希望能在T时间内做出最美味的食物,但是这些食物美味程度的计算方式比较奇葩,于是绝望的gw只好求助于你了。

    题目描述

    一共有n件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间。

    众所周知,gw的厨艺不怎么样,所以他需要你设计烹调方案使得美味指数最大

    输入输出格式

    输入格式:

    第一行是两个正整数T和n,表示到达地球所需时间和食材个数。

    下面一行n个整数,ai

    下面一行n个整数,bi

    下面一行n个整数,ci

    输出格式:

    输出最大美味指数

    输入输出样例

    输入样例#1:
    74 1
    502
    2
    47
    
    输出样例#1:
    408

    说明

    【数据范围】

    对于40%的数据1<=n<=10

    对于100%的数据1<=n<=50

    所有数字均小于100,000

    【题目来源】

    tinylic改编

    题解

    如果不考虑b这个属性,那么本题就是一个01背包

    对于相邻的两件食材x,y,设已经耗费的时间为t

    先做x,再做y的美味指数 :a[x]-(t+c[x])*b[x]+a[y]-(t+c[x]+c[y])*b[y]

    先做y,再做x的美味指数 :a[y]-(t+c[y])*b[y]+a[x]-(t+c[y]+c[x])*b[x]

    如果要让先做x的价值大于先做y的价值(即上面的1式大于2式),可解得c[x]*b[y]<c[y]*b[x]

    那么,我们就可以以c[x]*b[y]<c[y]*b[x]为排序条件,对读入的数据进行排序

    把算法再整理一遍

    1.开一个结构体数组k,存储食材的a,b,c三个属性

    2.读入后,根据c[x]*b[y]<c[y]*b[x]进行排序

    3.按照01背包的思路进行计算

    4.在f数组中从头到尾进行扫描,找出最大值

    代码

     1 #include <map>
     2 #include <queue>
     3 #include <stack>
     4 #include <ctime>
     5 #include <cmath>
     6 #include <cstdio>
     7 #include <cstring>
     8 #include <cstdlib>
     9 #include <iostream>
    10 #include <algorithm>
    11 #define ll long long
    12 
    13 using namespace std;
    14 
    15 ll T,n;
    16 ll f[100005];
    17 
    18 struct Node
    19 {
    20     ll a;
    21     ll b;
    22     ll c;
    23 }k[55];
    24 
    25 bool cmP(Node x,Node y)
    26 {
    27     return x.c*y.b<y.c*x.b;
    28 }
    29 
    30 void init()
    31 {
    32     cin>>T>>n;
    33     for (int i=1;i<=n;i++)
    34         cin>>k[i].a;
    35     for (int i=1;i<=n;i++)
    36         cin>>k[i].b;
    37     for (int i=1;i<=n;i++)
    38         cin>>k[i].c;
    39     sort (k+1,k+1+n,cmP);
    40     return;
    41 }
    42 
    43 void work()
    44 {
    45     for (int i=1;i<=n;i++)
    46         for (int v=T;v>=k[i].c;v--)
    47             f[v]=max(f[v],f[v-k[i].c]+k[i].a-v*k[i].b);
    48     ll maxn=-1;
    49     for (int i=1;i<=T;i++)
    50         maxn=max(maxn,f[i]);
    51     cout<<maxn<<endl;
    52     return;
    53 }
    54 
    55 int main()
    56 {
    57     init();
    58     work();
    59     return 0;
    60 }
    出处:https://www.cnblogs.com/yujustin/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    温馨提示:尽量使用版本较高的浏览器,并打开极速模式。
  • 相关阅读:
    The Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/yujustin/p/9715869.html
Copyright © 2011-2022 走看看