题意:

      给你一个有向图,每个节点上都有一个盐价,然后给你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. CCF(通信网络):简单DFS+floyd算法

    通信网络 201709-4 一看到题目分析了题意之后,我就想到用floyd算法来求解每一对顶点的最短路.如果一个点和任意一个点都有最短路(不为INF),那么这就是符合的一个答案.可是因为题目超时,只能 ...

  2. python3 中post处理json 数据

    使用详情如下 import json import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT ...

  3. Java数组:多维数组(二维),Arrays类,冒泡排序

    Arrays类数组工具类:java.util.ArraysArrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用 具有 ...

  4. 推荐模型DeepCrossing: 原理介绍与TensorFlow2.0实现

    DeepCrossing是在AutoRec之后,微软完整的将深度学习应用在推荐系统的模型.其应用场景是搜索推荐广告中,解决了特征工程,稀疏向量稠密化,多层神经网路的优化拟合等问题.所使用的特征在论文中 ...

  5. 目标检测入门论文YOLOV1精读以及pytorch源码复现(yolov1)

    结果展示 其中绿线是我绘制的图像划分网格. 这里的loss是我训练的 0.77 ,由于损失函数是我自己写的,所以可能跟大家的不太一样,这个不重要,重要的是学习思路. 重点提示 yolov1是一个目标检 ...

  6. Bug调试专项训练四笔记

    Ajax案例一 导入项目直接运行出现联想无反应 错误原因: 错误1: 55行找不到方法: 错误1解决方案: 解决错误1点击仍无反应 错误2:通过浏览器得出错误2:58行找不到方法 错误2解决方案: 解 ...

  7. 攻防世界 reverse parallel-comparator-200

    parallel-comparator-200 school-ctf-winter-2015 https://github.com/ctfs/write-ups-2015/tree/master/sc ...

  8. 认清 React 的useState逻辑

    useState运行过程解析 function App() { const [n, setN] = useState(0); //使用 myUseState() return ( <div> ...

  9. 20182217_刘洪宇 后门原理与实践 EXP2

    1.后门概念 后门就是不经过正常认证流程而访问系统的通道. 哪里有后门呢? 编译器留后门 操作系统留后门 最常见的当然还是应用程序中留后门 还有就是潜伏于操作系统中或伪装为特定应用的专用后门程序. - ...

  10. 别人 echo 、你也 echo ,是问 echo 知多少?-- Shell十三问<第三问>

    别人 echo .你也 echo ,是问 echo 知多少?-- Shell十三问<第三问> 承接上一章所介绍的 command line ,这里我们用 echo 这个命令加以进一步说明. ...