• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
scorpiorax
博客园    首页    新随笔    联系   管理    订阅  订阅
洛谷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改编

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 int i,j,n,T; 
 7 long long int f[100005] = {0},ans = 0;
 8 struct node
 9 {
10     long long int a;
11     long long int b;
12     long long int c;
13 }m[55];
14 bool cmp(node x,node y)
15 {
16     return x.c * y.b < y.c * x.b;
17 }
18 int main()
19 {
20     scanf("%d %d",&T,&n);
21     for(i = 1;i <= n;i++)
22     {
23         scanf("%lld",&m[i].a);
24     }
25     for(i = 1;i <= n;i++)
26     {
27         scanf("%lld",&m[i].b);
28      } 
29      for(i = 1;i <= n;i++)
30      {
31          scanf("%lld",&m[i].c);
32      }
33      sort(m + 1,m + 1 + n,cmp);
34      for(i = 1;i <= n;i++)
35     {
36           for(j = T;j >= m[i].c;j--)
37           {
38               f[j] = max(f[j],f[j - m[i].c] + (long long int)(m[i].a - j * m[i].b)); 
39         }
40     }
41      for(i = 1;i <= T;i++)
42      { 
43          ans = max(ans,f[i]);
44      }
45      printf("%lld",ans);
46      return 0;
47 }

 

*****强烈diss第十四个数据点卡longlong

由于这个是动态变化的价值,他就不可以按照正常的那种背包去写,需要判断x,y谁先谁后的那个式子,是的这个是一个贼拉麻烦的化简过程。

 

posted on 2018-11-02 11:04  scorpiorax  阅读(164)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3