O - 酱神寻宝

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit Status

酱神来到了一座小岛,岛上有n个箱子。

一共有3中不同的钥匙,金钥匙、银钥匙和万能钥匙。酱神一开始有a把金钥匙、b把银钥匙和c把万能钥匙。

第i个箱子上有xi把金锁,yi把银锁。金钥匙只能打开金锁,银钥匙只能打开银锁,万能钥匙两种锁都能打开。用于打开锁的钥匙会立刻损坏,酱神会丢掉损坏的钥匙。箱子里有ai把金钥匙、bi把银钥匙和ci把万能钥匙,想要取出箱内的钥匙必须要打开这xi+yi把锁。

酱神的目的是使他拥有的钥匙总数最多。一旦酱神认为自己已经拥有了最多的钥匙,他就不会去开剩下的箱子了。

Input

第一行一个数n。

接下来有n行。每行5个数,xi,yi,ai,bi,ci。

最后一行3个数a,b,c。

1=<n<=15

0=<xi,yi,ai,bi,ci,a,b,c<=10

Output

输出一个数酱神的最多钥匙数。

Sample input and output

Sample Input Sample Output
3
1 0 0 0 1
2 4 0 8 0
3 9 10 9 8
3 1 2
8
1
0 0 1 2 3
0 0 0
6

Hint

第一个样例中酱神会打开第一个和第二个箱子。

解题思路:

首先贪心,能用金 / 银就不用万能钥匙.

我们不妨令 f ( i , j ) -> 开启箱子的状态为 i , 金钥匙为 j 把时能获得最多的万能钥匙.

之后我们考虑更新,设 0 为没开启过, 1 为开启过.

每次更新都是由 x 个 0 的状态更新到 x+1 个 0 的状态.

我们采用bfs维护这种顺序即可

不过由于本题数据很水,各位可以尝试各种花式方法水过去!!

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
/*f( i , j ) - > 当前开的箱子的集合为 i , 金钥匙的数目是 j 时可以获得的最多万能钥匙数目.
*/using namespace std;
const int maxn = 15;
int n,sta,stb,stc,f[1 << 15][ maxn*11 ],ans = 0;
typedef struct Item
{int needA,needB,getA,getB,getC;
};typedef struct updatastatus
{int st,number;    updatastatus(const int &st,const int &number){this->st = st , this->number = number;}
};bool arrived[1 << 15][maxn * 11];
queue<updatastatus>q;
Item A[maxn+3];inline void updata(int i,int j,int newans)
{f[i][j] = max(f[i][j],newans);
}//可以开启为 0 , 不能开启为 1; int main(int argc,char *argv[])
{scanf("%d",&n);for(int i = 0 ; i < n ; ++ i) scanf("%d%d%d%d%d",&A[i].needA,&A[i].needB,&A[i].getA,&A[i].getB,&A[i].getC);scanf("%d%d%d",&sta,&stb,&stc);f[0][sta] = stc; // Init;memset(arrived,false,sizeof(arrived));q.push(updatastatus(0,sta));while(!q.empty()){updatastatus ns = q.front();q.pop();int ra = ns.number, rb, rc = f[ns.st][ns.number] , all = sta + stb + stc , st = ns.st;for(int i = 0 ; i < n ; ++ i)if (ns.st >> i & 1)all += A[i].getA + A[i].getB + A[i].getC - A[i].needA - A[i].needB;ans = max(ans,all);rb = all - ra - rc;for(int i = 0 ; i < n ; ++ i){if (!(st >> i & 1)){int needA = A[i].needA;int needB = A[i].needB;int getA = A[i].getA;int getB = A[i].getB;int getC = A[i].getC;if (ra >= needA) //金够
                        {if (rb >= needB) //金银都够
                           {updata(st | (1 << i) , ra - needA + getA, rc + getC);if (!arrived[st | (1 << i)][ra - needA + getA]){q.push(updatastatus(st | (1 << i),ra - needA + getA));arrived[st | (1 << i)][ra - needA + getA] = true;}    }else  //金够银不够
                  {if (needB- rb <= rc){updata(st | (1 << i) , ra - needA + getA, rc - needB + rb + getC);if (!arrived[st | (1 << i)][ra - needA + getA]){q.push(updatastatus(st | (1 << i),ra - needA + getA));arrived[st | (1 << i)][ra - needA + getA] = true;}    }}}else{if (rb >= needB) //金不够银够
                     {if (needA - ra <= rc){updata(st | (1 << i) , getA, rc - needA + ra + getC);if (!arrived[st | (1 << i)][getA]){q.push(updatastatus(st | (1 << i),getA));arrived[st | (1 << i)][getA] = true;}    }}else  //金不够银不够
                  {if (needA - ra + needB - rb <= rc){updata(st | (1 << i) , getA, rc - needA + ra - needB + rb + getC);if (!arrived[st | (1 << i)][getA]){q.push(updatastatus(st | (1 << i),getA));arrived[st | (1 << i)][getA] = true;}    }      } }}}}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Xiper/p/4539658.html

UESTC_酱神寻宝 2015 UESTC Training for Dynamic ProgrammingProblem O相关推荐

  1. UESTC_摩天轮 2015 UESTC Training for Dynamic ProgrammingProblem K

    K - 摩天轮 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  2. 2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp

    F - 柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) ...

  3. UESTC_秋实大哥与快餐店 2015 UESTC Training for Data StructuresProblem C

    C - 秋实大哥与快餐店 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Sub ...

  4. UESTC_秋实大哥与花 2015 UESTC Training for Data StructuresProblem B

    B - 秋实大哥与花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. UESTC_秋实大哥下棋 2015 UESTC Training for Data StructuresProblem I

    I - 秋实大哥下棋 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  6. UESTC_邱老师的脑残粉 2015 UESTC Training for Graph TheoryProblem D

    D - 邱老师的脑残粉 Time Limit: 12000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Sub ...

  7. 2015 UESTC Training for Search Algorithm String - M - Palindromic String【Manacher回文串】

    O(n)的复杂度求回文串:Manacher算法 定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串 现在给一个2*10^6长度 ...

  8. 2015 UESTC Winter Training #10【Northeastern Europe 2009】

    2015 UESTC Winter Training #10 Northeastern Europe 2009 最近集训都不在状态啊,嘛,上午一直在练车,比赛时也是刚吃过午饭,状态不好也难免,下次比赛 ...

  9. 2015 UESTC Winter Training #6【Regionals 2010 North America - Rocky Mountain】

    2015 UESTC Winter Training #6 Regionals 2010 >> North America - Rocky Mountain A - Parenthesis ...

最新文章

  1. 人工智能和机器学习技术推动企业发展
  2. 如何移植行情软件的指标到千发股票自动交易软件?
  3. 成功解决ModuleNotFoundError: No module named 'torchvision.ops'
  4. .Net开源工作流Roadflow的使用与集成
  5. mac上java文件如何编译_如何在Mac上用Java编译和运行程序?
  6. java 企业 网站源码 模版 屏幕自适应 有前后台 springmvc SSM 生成静态化
  7. keras——基于神经网络的风格迁移生成艺术字
  8. 小程序插件开发使用教程
  9. js正则表达式匹配多个条件
  10. r7000屏幕亮度linux,联想legion R7000笔记本linux使用体验
  11. 算法导论———归并排序(JAVA、Python)
  12. 【2022】将3D目标检测看作序列预测-Point2Seq: Detecting 3D Objects as Sequences
  13. 大学生找工作如何做自我介绍?如何做好自我介绍?
  14. 《HelloGitHub》第 48 期
  15. 用vba复制模板,并根据指定的列形成多个sheet重命名
  16. 数据库大作业 openGauss程序设计
  17. Java中类、抽象类、接口的联系与区别
  18. 数方大数据抓取网站访问用户,精准度百分之九十以上。
  19. 天合光能宣布完成私有化
  20. 自动泊车(之三)车位线定位(视觉定位)

热门文章

  1. 【Tools】Ubuntu18.04破解root密码
  2. [Qt教程] 第24篇 数据库(四)SQL查询模型QSqlQueryModel
  3. [Qt教程] 第49篇 进阶(九) 多媒体应用简介
  4. [Qt教程] 第15篇 2D绘图(五)绘制图片
  5. html一条横线在文本旁边_lt;delgt; | HTML删除标记标签
  6. android edittext seterror,EditText之setError方法一二
  7. LVS(7)——NAT实践
  8. 使用代理下载android系统源码和SDK
  9. 2025 : 简单环路(并查集)
  10. 8086汇编_除法指令