UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>
O - 酱神寻宝
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
酱神来到了一座小岛,岛上有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 |
8 |
1 |
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 = ;
int n,sta,stb,stc,f[ << ][ maxn* ],ans = ;
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[ << ][maxn * ];
queue<updatastatus>q;
Item A[maxn+]; 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 = ; 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[][sta] = stc; // Init;
memset(arrived,false,sizeof(arrived));
q.push(updatastatus(,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 = ; i < n ; ++ i)
if (ns.st >> i & )
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 = ; i < n ; ++ i)
{
if (!(st >> i & ))
{
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 | ( << i) , ra - needA + getA, rc + getC);
if (!arrived[st | ( << i)][ra - needA + getA])
{
q.push(updatastatus(st | ( << i),ra - needA + getA));
arrived[st | ( << i)][ra - needA + getA] = true;
}
}
else //金够银不够
{
if (needB- rb <= rc)
{
updata(st | ( << i) , ra - needA + getA, rc - needB + rb + getC);
if (!arrived[st | ( << i)][ra - needA + getA])
{
q.push(updatastatus(st | ( << i),ra - needA + getA));
arrived[st | ( << i)][ra - needA + getA] = true;
}
}
}
}
else
{
if (rb >= needB) //金不够银够
{
if (needA - ra <= rc)
{
updata(st | ( << i) , getA, rc - needA + ra + getC);
if (!arrived[st | ( << i)][getA])
{
q.push(updatastatus(st | ( << i),getA));
arrived[st | ( << i)][getA] = true;
}
}
}
else //金不够银不够
{
if (needA - ra + needB - rb <= rc)
{
updata(st | ( << i) , getA, rc - needA + ra - needB + rb + getC);
if (!arrived[st | ( << i)][getA])
{
q.push(updatastatus(st | ( << i),getA));
arrived[st | ( << i)][getA] = true;
}
}
}
}
}
}
}
printf("%d\n",ans);
return ;
}
UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>的更多相关文章
- UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>
M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>
C - 酱神赏花 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Submi ...
- UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>
I - 邱老师选妹子(二) Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Su ...
- UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>
H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>
F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>
J - 男神的约会 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_男神的礼物 2015 UESTC Training for Dynamic Programming<Problem A>
A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>
N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<Problem L>
L - 菲波拉契数制升级版 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Su ...
随机推荐
- 【转】各个层次的gcc警告 #pragma GCC diagnostic ignored "-Wunused-parameter" --不错
原文网址:http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __ ...
- MFC调用c#的dll
一.使用 /clr 编译 MFC 可执行文件或规则 DLL 1.打开“项目属性”对话框,方法是右键单击“解决方案资源管理器”中的项目并选择“属性”. 2.展开“配置属性”旁边的节点并选择“常规”.在右 ...
- SEXTANTE中调用任意C++控制台程序的简单例子
在sextante中单纯利用python或者调用sextante已有算法进行自定义开发,很多情况下速度不咋给力,同样的操作调用QGIS的C++插件比用sextante里的算法要快,有时候快的 还不止一 ...
- win下 git gui 使用教程
现在很多都有git来托管项目或者来查找资料,但是看起来操作不是很方便,现在由于win下可以直接使用git gui,让使用git变得方便,当然这只是针对日常简单的使用,如果想详细的使用,可以去参考廖学峰 ...
- CSS---------------之文本类型
通过font来改变文本,主要从以下几个方面 字体加粗,字体的风格:斜体和字体变形:小型大写字母 字体的大小 行高 字体 示例如下 p{font:italic 75%/125% "Comic ...
- WebApi官网学习记录---webapi中controller与action的选择
如果framework找到一个匹配的URI,创建一个包含占位符值的字典,key就是这些占位符(不包括大括号),value来自URI或者默认值,这个字典存储在IHttpRouteData对象中.默认值可 ...
- hbase权威指南学习笔记--架构--存储
HBase主要处理两种文件:预写日志(Write-Ahead Log,WAL),实际的数据文件. 一个基本的流程是客户端首先联系ZooKeeper子集群查找行健数据所在的region服务器名.(通过Z ...
- iBatis2之SqlMap配置总结(18条)
iBatis2之SqlMap配置总结(18条) SqlMap的配置是iBatis中应用的核心.这部分任务占据了iBatis开发的70的工作量. 1.命名空间: <sqlMap names ...
- C++服务器设计(零):总体设计
这个系列把毕业论文的部分贴了出来,以作保存留念.整个系列分为三大部分,其中第一章到第三章是介绍服务器的系统层设计,设计思路参考了libevent和muduo等开源代码的实现:第四章到第六章是介绍服务器 ...
- poj2778DNA Sequence (AC自动机+矩阵快速幂)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud DNA Sequence Time Limit: 1000MS Memory ...