题意:

      给你一个有向图,每个节点上都有一个盐价,然后给你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 不错的搜索( 买卖盐,要求整钱最多)的更多相关文章

  1. SPOJ:Strange Waca(不错的搜索&贪心&剪枝)

    Waca loves maths,.. a lot. He always think that 1 is an unique number. After playing in hours, Waca ...

  2. hdu4784

    题意: 给了一个图 从1号节点走到N号节点,然后,每个地方有买卖盐的差价,然后求 到达N的最大价值,一旦走到N这个点就不能再走了,或者走到不能再别的世界走1和N这两个点,然后接下来 用一个 四维的数组 ...

  3. FileSeek文件内容搜索工具下载

    Windows 内建的搜索功能十分简单,往往不能满足用户的需要.很多的第三方搜索工具因此诞生,比如 Everything,Locate32等. 而FileSeek也是一款不错的搜索工具,其不同于其他搜 ...

  4. 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力

    可能你和我一样,几乎每天都必须与搜索引擎打交道,不过很多时候,你辛辛苦苦搜了半天也没找到合适的资料,然而“高手们”上来一眨眼功夫就能命中目标了.这并不是别人运气好,而是搜索引擎其实是有很多技巧可以帮助 ...

  5. 【bzoj4428】[Nwerc2015]Debugging调试 数论+记忆化搜索

    题目描述 一个 $n$ 行的代码出了bug,每行都可能会产生这个bug.你要通过输出调试,在其中加入printf来判断bug出现的位置.运行一次程序的时间为 $r$ ,加入一条printf的时间为 $ ...

  6. hdu1181 dfs搜索之变形课

    原题地址 这道题数据据说比較水,除了第一组数据是Yes以外.其余都是No.非常多人抓住这点就水过了.当然了,我认为那样过了也没什么意思.刷oj刷的是质量不是数量. 这道题从题目上来看是个不错的 搜索题 ...

  7. codevs 4228 小猫爬山 【搜索】By cellur925

    题目描述 Description Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). ...

  8. 【python网络编程】新浪爬虫:关键词搜索爬取微博数据

    上学期参加了一个大数据比赛,需要抓取大量数据,于是我从新浪微博下手,本来准备使用新浪的API的,无奈新浪并没有开放关键字搜索的API,所以只能用爬虫来获取了.幸运的是,新浪提供了一个高级搜索功能,为我 ...

  9. HDU--4784 Dinner Coming Soon DP+BFS

    题意非常长非常变态.一个人要到他男朋友家,他最初有R元以及T分钟的时间来赶到他男朋友家.有N个房子M条道路,每条道路有须要消耗的时间以及过路费,同一时候还要顺路做食盐生意,起初身上没有食盐,最多带B袋 ...

随机推荐

  1. [个人总结]pytorch中model.eval()会对哪些函数有影响?

    来源于知乎:pytorch中model.eval()会对哪些函数有影响? - 蔺笑天的回答 - 知乎 https://www.zhihu.com/question/363144860/answer/9 ...

  2. 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图

    之前写过三篇文章,收获了极其不错的阅读量与转发量: 你真的会用 VS Code 的 Ctrl.Shift和Alt吗?高效易用的快捷键:多光标.跳转引用等轻松搞定 VS Code 中的 Vim 操作 | ...

  3. 部分rpm包总结描述

    acl-2.2.51-15.el7.x86_64 Commands for Manipulating POSIX(可移植操作系统接口 of unix) Access Control Lists.有ge ...

  4. 前端 JS 加密漏洞挖掘篇

    案例一 oxo1 前言 某授权项目,登录口用户名和密码都进行了加密,之前从来没搞过记录一下学习过程. 看了CoolCat 师傅写的 https://github.com/TheKingOfDuck/b ...

  5. 2019 GDUT Rating Contest II : Problem B. Hoofball

    题面: 传送门 B. Hoofball Input file: standard input Output file: standard output Time limit: 5 second Memor ...

  6. 文本相似性计算--MinHash和LSH算法

    给定N个集合,从中找到相似的集合对,如何实现呢?直观的方法是比较任意两个集合.那么可以十分精确的找到每一对相似的集合,但是时间复杂度是O(n2).此外,假如,N个集合中只有少数几对集合相似,绝大多数集 ...

  7. vue+element+oss实现前端分片上传和断点续传

    纯前端实现: 切片上传 断点续传 .断点续传需要在切上上传的基础上实现 前端之前上传OSS,无需后端提供接口.先上完整代码,直接复制,将new OSS里的参数修改成自己公司OSS相关信息后可用,如遇问 ...

  8. C++并发与多线程学习笔记--unique_lock详解

    unique_lock 取代lock_quard unique_lock 的第二个参数 std::adopt_lock std::try_to_lock std::defer_lock unique_ ...

  9. 设计Web页面(2)

    1.前面我们新建了一个空白的ASP.NET网页,那么接下来这章我们就讲一下设计Web页面 2.布局页面有两种方法,一种是通过Table表格来布局页面窗体,另一种是通过CSS+DIV来布局窗体,其中作为 ...

  10. [Fundamental of Power Electronics]-PART I-6.变换器电路-6.2 变换器简单罗列

    6.2 变换器简单罗列 变换器的数量可能有无穷种,因此将其全部列出是不可能的.这里给出了一个简单的罗列清单. 首先考虑含单个电感的单输入单输出变换器的类别.可以在电源和负载之间进行连接电感的方法数量是 ...