题意:

      给你一个有向图,每个节点上都有一个盐价,然后给你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. WEB服务-Nginx之十-keepalived

    WEB服务-Nginx之10-keepalived 目录 WEB服务-Nginx之10-keepalived Keepalived和高可用 基本概述 Keepalived安装配置 Keepalived ...

  2. jdk 集合大家族之Collection

    jdk 集合大家族之Collection 前言:   此处的集合指的是java集合框架中的实现了Collection接口相关的类.所以主要为List Set 和 Queue 其他章节会专门介绍Map相 ...

  3. WDN302国产化网络存储控制模块

    WDN302是一款网络存储控制模块,实现对NAS和IP-SAN的混合支持,通过以太网对海量存储的访问,实现数据的存储.共享.恢复和防丢失. 飞腾 FT1500A/16处理器,主频 1.5GHz: 支持 ...

  4. 【译】Rust宏:教程与示例(二)

    原文标题:Macros in Rust: A tutorial with examples 原文链接:https://blog.logrocket.com/macros-in-rust-a-tutor ...

  5. Java BasicNameValuePair怎么传数组类型的参数?

    BasicNameValuePair 传数组的话可以这样传 map.put("ids[]", 1); map.put("ids[]", 2);

  6. Windows下解析命令行参数

    linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...

  7. Flutter原理简介

    Flutter 是怎么运转的? 与用于构建移动应用程序的其他大多数框架不同,Flutter 是重写了一整套包括底层渲染逻辑和上层开发语言的完整解决方案.这样不仅可以保证视图渲染在 Android 和 ...

  8. 清明节特辑 |记忆存储、声音还原、性格模仿……AI可以让人类永生吗?

    摘要:如果能用AI "复活"逝去的亲人 你愿意吗? 清明节,很少有人会去特地想这样一个问题:我们为什么要给过世的人修墓,然后每年固定的时间去扫墓?当农耕文化的色彩褪去,清明节的祭祀 ...

  9. (5)MySQL进阶篇SQL优化(优化数据库对象)

    1.概述 在数据库设计过程中,用户可能会经常遇到这种问题:是否应该把所有表都按照第三范式来设计?表里面的字段到底改设置为多大长度合适?这些问题虽然很小,但是如果设计不当则可能会给将来的应用带来很多的性 ...

  10. JS基础学习第三天

    条件分支语句switch语句语法: 1234567891011121314 switch(条件表达式){ case 表达式: 语句... break; case 表达式: 语句... break; c ...