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
  1. 3
  2. 1 0 0 0 1
  3. 2 4 0 8 0
  4. 3 9 10 9 8
  5. 3 1 2
  1. 8
  1. 1
  2. 0 0 1 2 3
  3. 0 0 0
  1. 6

Hint

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

解题思路:

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

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

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

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

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

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

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <queue>
  6. /*
  7. f( i , j ) - > 当前开的箱子的集合为 i , 金钥匙的数目是 j 时可以获得的最多万能钥匙数目.
  8. */
  9.  
  10. using namespace std;
  11. const int maxn = ;
  12. int n,sta,stb,stc,f[ << ][ maxn* ],ans = ;
  13. typedef struct Item
  14. {
  15. int needA,needB,getA,getB,getC;
  16. };
  17.  
  18. typedef struct updatastatus
  19. {
  20. int st,number;
  21. updatastatus(const int &st,const int &number)
  22. {
  23. this->st = st , this->number = number;
  24. }
  25. };
  26.  
  27. bool arrived[ << ][maxn * ];
  28. queue<updatastatus>q;
  29. Item A[maxn+];
  30.  
  31. inline void updata(int i,int j,int newans)
  32. {
  33. f[i][j] = max(f[i][j],newans);
  34. }
  35.  
  36. //可以开启为 0 , 不能开启为 1;
  37.  
  38. int main(int argc,char *argv[])
  39. {
  40. scanf("%d",&n);
  41. for(int i = ; i < n ; ++ i) scanf("%d%d%d%d%d",&A[i].needA,&A[i].needB,&A[i].getA,&A[i].getB,&A[i].getC);
  42. scanf("%d%d%d",&sta,&stb,&stc);
  43. f[][sta] = stc; // Init;
  44. memset(arrived,false,sizeof(arrived));
  45. q.push(updatastatus(,sta));
  46. while(!q.empty())
  47. {
  48. updatastatus ns = q.front();q.pop();
  49. int ra = ns.number, rb, rc = f[ns.st][ns.number] , all = sta + stb + stc , st = ns.st;
  50. for(int i = ; i < n ; ++ i)
  51. if (ns.st >> i & )
  52. all += A[i].getA + A[i].getB + A[i].getC - A[i].needA - A[i].needB;
  53. ans = max(ans,all);
  54. rb = all - ra - rc;
  55. for(int i = ; i < n ; ++ i)
  56. {
  57. if (!(st >> i & ))
  58. {
  59. int needA = A[i].needA;
  60. int needB = A[i].needB;
  61. int getA = A[i].getA;
  62. int getB = A[i].getB;
  63. int getC = A[i].getC;
  64. if (ra >= needA) //金够
  65. {
  66. if (rb >= needB) //金银都够
  67. {
  68. updata(st | ( << i) , ra - needA + getA, rc + getC);
  69. if (!arrived[st | ( << i)][ra - needA + getA])
  70. {
  71. q.push(updatastatus(st | ( << i),ra - needA + getA));
  72. arrived[st | ( << i)][ra - needA + getA] = true;
  73. }
  74. }
  75. else //金够银不够
  76. {
  77. if (needB- rb <= rc)
  78. {
  79. updata(st | ( << i) , ra - needA + getA, rc - needB + rb + getC);
  80. if (!arrived[st | ( << i)][ra - needA + getA])
  81. {
  82. q.push(updatastatus(st | ( << i),ra - needA + getA));
  83. arrived[st | ( << i)][ra - needA + getA] = true;
  84. }
  85. }
  86. }
  87. }
  88. else
  89. {
  90. if (rb >= needB) //金不够银够
  91. {
  92. if (needA - ra <= rc)
  93. {
  94. updata(st | ( << i) , getA, rc - needA + ra + getC);
  95. if (!arrived[st | ( << i)][getA])
  96. {
  97. q.push(updatastatus(st | ( << i),getA));
  98. arrived[st | ( << i)][getA] = true;
  99. }
  100. }
  101. }
  102. else //金不够银不够
  103. {
  104. if (needA - ra + needB - rb <= rc)
  105. {
  106. updata(st | ( << i) , getA, rc - needA + ra - needB + rb + getC);
  107. if (!arrived[st | ( << i)][getA])
  108. {
  109. q.push(updatastatus(st | ( << i),getA));
  110. arrived[st | ( << i)][getA] = true;
  111. }
  112. }
  113. }
  114. }
  115. }
  116. }
  117. }
  118. printf("%d\n",ans);
  119. return ;
  120. }

UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>的更多相关文章

  1. UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>

    M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  2. UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>

    C - 酱神赏花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  3. UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>

    I - 邱老师选妹子(二) Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

  4. UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>

    H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>

    F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  6. UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>

    J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  7. UESTC_男神的礼物 2015 UESTC Training for Dynamic Programming<Problem A>

    A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  8. UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>

    N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  9. UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<Problem L>

    L - 菲波拉契数制升级版 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

随机推荐

  1. nodejs学习笔记之包、模块实现

        简单了解了node的安装和一些基本的常识之后,今天学习了node中很重要的包和模块的一些知识点.       首先学习一下包的规范,它由包结构和包描述两部分组成.包结构用于组织包的各种文件,包 ...

  2. YYmodel 郭耀源 底层分析

    http://www.tuicool.com/articles/meAzIny         YYModel 简介与使用 http://www.jianshu.com/p/663c7b608ff5 ...

  3. Android 环境配置:git开启多颜色模式

    git config --global color.status autogit config --global color.diff autogit config --global color.br ...

  4. iOS经常使用的加密算法

    在iOS开发中,为了数据的安全经常对内容进行加密,在这儿我们对经常使用的加密算法进行了总结: 1.MD5 <span style="font-size:18px;">+ ...

  5. vue-resource插件使用

    本文的主要内容如下: 介绍vue-resource的特点 介绍vue-resource的基本使用方法 基于this.$http的增删查改示例 基于this.$resource的增删查改示例 基于int ...

  6. Unity 图片的灰度处理

    我们平时在做项目时,经常遇到按钮的点击而且还要区分悬浮,点击,禁用的状态,美术要针对一张图片做多个状态图片,资源图片的数量也就增大了,那么打出的包的大小也就跟着上去了,所以我们可以针对原始图片进行Sh ...

  7. 解决ERROR 2006 (HY000): MySQL server has gone away

    刚把博客从百度云搬到腾讯云,发现文章少了几篇.当时在导入dump数据的时候,就曾经发现mysql提示: ERROR 2006 (HY000): MySQL server has gone away N ...

  8. 【SQL学习笔记】排名开窗函数,聚合开窗函数(Over by)

    处理一些分组后,该组按照某列排序后 ,取其中某条完整数据的问题. 或 按照其中不同列分组后的聚合 比如 sum,avg之类. MSDN上语法: Ranking Window Functions < ...

  9. .net中用到的一些方法

    //文件操作string fullDirPath = Utils.GetMapPath(string.Format("/aspx/{0}/", buildPath)); Direc ...

  10. Spring MVC中数据绑定(转)

    Spring MVC中数据绑定 比如Product有一个createTime属性,是java.util.Date类型.那么最简单的转型处理是,在SimpleFormController中覆盖initB ...