hdu4784 不错的搜索( 买卖盐,要求整钱最多)
题意:
给你一个有向图,每个节点上都有一个盐价,然后给你k个空间,么个空间上节点与节点的距离不变,但盐价不同,对于每一个节点,有三种操作,卖一袋盐,买一袋盐 ,不交易,每一个节点可以跳掉(当前空间+1)%K的空间(特别注意,起点1和终点n不可以穿越),花费是时间1,金钱0 ,节点与节点之间都有花费时间和花费金钱,过程中金钱不可以是负数,问从节点1出发,在限制的时间内到达节点n的最大金钱数。
思路:
这个题目做了将近两天,一开始写了各种深搜,各种超时,各种wa然后就开始各种广搜,写了很多版本,终于有一个能过的了,这个题目关键是就超时问题,说下思路,首先我们可以开一个数组mark[i][t][k][b] 表示的是第i个节点第t时刻,在第k层,有b袋盐的最大金钱数,然后就是搜索,写完了就是各种超时?为什么会超时,是因为我们进队出队次数太多,如果随意一算可能会这么想 可能会如认为进队次数是 N
* T * K * B也就是mark的最大组合数,其实不然,对于同一个状态可能会进队多次,如果我们什么也不管,直接暴力,就是能更新就更新然后进队列,那么就会出现这么一种情况“当前这一步比之前的大了,我们直接更新进队,过了一会之后又来了一个,更新后的更大了,那么我们在更新进入队列”不要小看这两次进队,其实第一次进队我们所付出的代价是什么,代价是进队后更新后面的可更新的,等第二次进队了,再把后面的能更新的又更新了,这样的话,暴搜的代价就很大了,具体多大我算不明白,但妥妥保证你超时,就算你之前写一个逆向的最短路作为优化,照样超时(我试过很多种),那么该怎么办呢?其实对于每一个点,我们可以先把他的最优求出来,然后再去更新别人,因为是最优,所以这个点只会进队列一次,那怎么求最优呢?我们可以开个优先队列,就是把广搜的队列用优先队列,每次取出时间最小的,这样对于当前时间,比如是4,那么5这个时间点更新的时候<=4的肯定更新到最优了,所以这样每个点只要进队列一次就行了,优化了时间就可以ac了,如果你不满足于ac,还想更快,可以在写一个最短路去优化,反向存边,时间是权值,从终点跑一遍最短路,然后对于每一步来说,如果时间已经不能到终点了,那么当前终点就直接continue了。
#include<stdio.h>
#include<string.h>
#include<queue> #define N_node 110
#define N_edge 220
#define INF 1000000000
using namespace std; typedef struct
{
int to ,next ,time ,money;
}STAR; typedef struct NODE
{
int nowt ,nowc ,nowy ,id;
friend bool operator < (NODE a ,NODE b)
{
return a.nowt < b.nowt;
}
}NODE; STAR E[N_edge];
NODE xin ,tou;
int list[N_node] ,tot;
int pic[6][N_node];
int mark[N_node][220][8][8];
int mk[N_node][220][8][8];
int N ,M ,B ,K ,R ,T ,Ans; void add(int a ,int b ,int c ,int d)
{
E[++tot].to = b;
E[tot].time = c;
E[tot].money = d;
E[tot].next = list[a];
list[a] = tot;
} void BFS()
{
memset(mark ,255 ,sizeof(mark));
memset(mk ,0 ,sizeof(mk));
xin.id = 1 ,xin.nowc = 0 ,xin.nowt = T ,xin.nowy = 0;
priority_queue<NODE>q;
q.push(xin);
mark[xin.id][xin.nowt][xin.nowc][xin.nowy] = R;
mk[xin.id][xin.nowt][xin.nowc][xin.nowy] = 1;
while(!q.empty())
{
tou = q.top();
q.pop();
if(tou.id == N)
{
if(Ans < mark[tou.id][tou.nowt][tou.nowc][tou.nowy])
Ans = mark[tou.id][tou.nowt][tou.nowc][tou.nowy];
continue;
} for(int k = list[tou.id] ; k ;k = E[k].next)
{
xin.id = E[k].to;
xin.nowc = tou.nowc;
xin.nowt = tou.nowt - E[k].time;
int cost = mark[tou.id][tou.nowt][tou.nowc][tou.nowy] - E[k].money;
if(xin.nowt < 0 || cost < 0) continue;
if(xin.id == 1 && xin.nowc || xin.id == N && xin.nowc)
continue;
//不交易
xin.nowy = tou.nowy;
if(cost > mark[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mark[xin.id][xin.nowt][xin.nowc][xin.nowy] = cost;
if(!mk[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mk[xin.id][xin.nowt][xin.nowc][xin.nowy] = 1;
q.push(xin);
}
}
if(xin.id == 1 || xin.id == N) continue;
//买
xin.nowy = tou.nowy + 1;
if(xin.nowy <= B && cost - pic[xin.nowc][xin.id] >= 0)
{
if(cost - pic[xin.nowc][xin.id] > mark[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mark[xin.id][xin.nowt][xin.nowc][xin.nowy] = cost - pic[xin.nowc][xin.id];
if(!mk[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mk[xin.id][xin.nowt][xin.nowc][xin.nowy] = 1;
q.push(xin);
}
}
}
//卖
xin.nowy = tou.nowy - 1;
if(xin.nowy >= 0)
{
if(cost + pic[xin.nowc][xin.id] > mark[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mark[xin.id][xin.nowt][xin.nowc][xin.nowy] = cost + pic[xin.nowc][xin.id];
if(!mk[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mk[xin.id][xin.nowt][xin.nowc][xin.nowy] = 1;
q.push(xin);
}
}
}
} if(tou.id == 1 || tou.id == N) continue;
xin.id = tou.id;
xin.nowc = (tou.nowc + 1) % K;
xin.nowt = tou.nowt - 1;
if(xin.nowt < 0) continue;
int cost = mark[tou.id][tou.nowt][tou.nowc][tou.nowy];
//不交易
xin.nowy = tou.nowy;
if(cost > mark[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mark[xin.id][xin.nowt][xin.nowc][xin.nowy] = cost;
if(!mk[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mk[xin.id][xin.nowt][xin.nowc][xin.nowy] = 1;
q.push(xin);
}
}
//买
xin.nowy = tou.nowy + 1;
if(xin.nowy <= B && cost - pic[xin.nowc][xin.id] >= 0)
{
if(cost - pic[xin.nowc][xin.id] > mark[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mark[xin.id][xin.nowt][xin.nowc][xin.nowy] = cost - pic[xin.nowc][xin.id];
if(!mk[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mk[xin.id][xin.nowt][xin.nowc][xin.nowy] = 1;
q.push(xin);
}
}
}
//卖
xin.nowy = tou.nowy - 1;
if(xin.nowy >= 0)
{
if(cost + pic[xin.nowc][xin.id] > mark[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mark[xin.id][xin.nowt][xin.nowc][xin.nowy] = cost + pic[xin.nowc][xin.id];
if(!mk[xin.id][xin.nowt][xin.nowc][xin.nowy])
{
mk[xin.id][xin.nowt][xin.nowc][xin.nowy] = 1;
q.push(xin);
}
}
}
}
} int main ()
{
int i ,j ,a ,b ,c ,d;
int cas = 1 ,t;
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d %d %d %d %d" ,&N ,&M ,&B ,&K ,&R ,&T);
for(i = 0 ;i < K ;i ++)
for(j = 1 ;j <= N ;j ++)
scanf("%d" ,&pic[i][j]);
memset(list ,0 ,sizeof(list)) ,tot = 1;
for(i = 1 ;i <= M ;i ++)
{
scanf("%d %d %d %d" ,&a ,&b ,&c ,&d);
add(a ,b ,c ,d);
}
Ans = -1;
BFS();
printf("Case #%d: " ,cas ++);
Ans == -1 ? puts("Forever Alone"):printf("%d\n" ,Ans);
}
return 0;
}
hdu4784 不错的搜索( 买卖盐,要求整钱最多)的更多相关文章
- SPOJ:Strange Waca(不错的搜索&贪心&剪枝)
Waca loves maths,.. a lot. He always think that 1 is an unique number. After playing in hours, Waca ...
- hdu4784
题意: 给了一个图 从1号节点走到N号节点,然后,每个地方有买卖盐的差价,然后求 到达N的最大价值,一旦走到N这个点就不能再走了,或者走到不能再别的世界走1和N这两个点,然后接下来 用一个 四维的数组 ...
- FileSeek文件内容搜索工具下载
Windows 内建的搜索功能十分简单,往往不能满足用户的需要.很多的第三方搜索工具因此诞生,比如 Everything,Locate32等. 而FileSeek也是一款不错的搜索工具,其不同于其他搜 ...
- 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力
可能你和我一样,几乎每天都必须与搜索引擎打交道,不过很多时候,你辛辛苦苦搜了半天也没找到合适的资料,然而“高手们”上来一眨眼功夫就能命中目标了.这并不是别人运气好,而是搜索引擎其实是有很多技巧可以帮助 ...
- 【bzoj4428】[Nwerc2015]Debugging调试 数论+记忆化搜索
题目描述 一个 $n$ 行的代码出了bug,每行都可能会产生这个bug.你要通过输出调试,在其中加入printf来判断bug出现的位置.运行一次程序的时间为 $r$ ,加入一条printf的时间为 $ ...
- hdu1181 dfs搜索之变形课
原题地址 这道题数据据说比較水,除了第一组数据是Yes以外.其余都是No.非常多人抓住这点就水过了.当然了,我认为那样过了也没什么意思.刷oj刷的是质量不是数量. 这道题从题目上来看是个不错的 搜索题 ...
- codevs 4228 小猫爬山 【搜索】By cellur925
题目描述 Description Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). ...
- 【python网络编程】新浪爬虫:关键词搜索爬取微博数据
上学期参加了一个大数据比赛,需要抓取大量数据,于是我从新浪微博下手,本来准备使用新浪的API的,无奈新浪并没有开放关键字搜索的API,所以只能用爬虫来获取了.幸运的是,新浪提供了一个高级搜索功能,为我 ...
- HDU--4784 Dinner Coming Soon DP+BFS
题意非常长非常变态.一个人要到他男朋友家,他最初有R元以及T分钟的时间来赶到他男朋友家.有N个房子M条道路,每条道路有须要消耗的时间以及过路费,同一时候还要顺路做食盐生意,起初身上没有食盐,最多带B袋 ...
随机推荐
- OpenGL导出渲染的图像到外部文件中
需要配置Freeimage库 首先下载好FreeImage 找打dist目录下的x32目录,将.h文件放在包含目录下:将lib文件放在库目录下,将dll放在运行目录下 保存渲染结果到png格式的图像: ...
- Java程序员必备后台前端框架--Layui【从入门到实战】(二)
layui使用 导航菜单.选项卡 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] [编程工具:IDEA] 导航菜单 在layui官网中示例中,我们可以找到关于导航的例子: 我们点击查 ...
- C#类中的成员
@ 目录 字段 属性 方法 构造函数 类和对象的简单解释 创建类和对象 类中成员的归属问题 字段 字段的声明与声明变量类似,可以添加访问修饰符,通常情况下字段设置为私有的,然后定义属性对字段的读写进行 ...
- 谈谈C++中的数据对齐
对于C/C++程序员来说,掌握数据对齐是很有必要的,因为只有了解了这个概念,才能知道编译器在什么时候会偷偷的塞入一些字节(padding)到我们的结构体(struct/class),也唯有这样我们才能 ...
- 关于Java中Collections.sort和Arrays.sort的稳定性问题
一 问题的提出 关于Java中Collections.sort和Arrays.sort的使用,需要注意的是,在本文中,比较的只有Collections.sort(List<T> ele ...
- 浅析MyBatis(四):全自动写代码的MyBatis逆向工程
在前面几篇文章中,笔者介绍了 MyBatis 的运行流程,在此基础上简单介绍了手写 MyBatis 简易框架与自定义 MyBatis 插件的步骤,相信大家对于 MyBatis 框架的使用流程已经游刃有 ...
- JDK 16 正式发布,一次性发布 17 个新特性…不服不行!
上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...
- 量体裁衣方得最优解:聊聊页面静态化架构和二级CDN建设
量体裁衣方得最优解:聊聊页面静态化架构和二级CDN建设 上期文章中我们介绍了CDN和云存储的实践,以及云生态的崛起之路,今天,我们继续聊一聊CDN. 我们通常意义上讲的CDN,更多的是针对静态资源类的 ...
- 三分钟玩转微软AI量化投资开源库QLib
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 微软QLib简介 微软亚洲研究院发布了 AI 量化投资开源平台"微矿 Qlib".Q ...
- [Fundamental of Power Electronics]-PART II-7. 交流等效电路建模-7.4 规范电路模型
7.4 规范电路模型 在讨论了推导开关变换器交流等效电路模型的几种方法后,让我们先停下来,说明下这些结果.所有的在 CCM下以PWM工作的DC-DC变换器都具有相似的基本功能.首先,他们在理想情况下, ...