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袋 ...
随机推荐
- springboot源码解析-管中窥豹系列之EnableXXX(十)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- pytorch(12)ContainersAndAlexNet
containers graph LR A["Containers"] --> B["nn.Sequetial"] B["nn.Sequetia ...
- pytorch(01)环境配置及安装
pytorch pytorch定位:深度学习框架 人工智能:多领域交叉科学技术 机器学习:计算机智能决策算法 深度学习:高效的机器学习算法 pytorch实现模型训练需要5个模块 数据 将数据从硬盘读 ...
- python3中post和get请求处理
post 请求处理 def url(): url = "www.xxx.com.cn" data = { "csrfmiddlewaretoken":" ...
- 「CTSC 2013」组合子逻辑
Tag 堆,贪心 Description 给出一个数列 \(n\) 个数,一开始有一个括号包含 \([1,n]\),你需要加一些括号,使得每个括号(包括一开始的)所包含的元素个数 \(\leq\) 这 ...
- Redis 通过 RDB 方式进行数据备份与还原
Redis 通过 RDB 方式进行数据备份与还原 Intro 有的时候我们需要对 Redis 的数据进行迁移,今天介绍一下通过 RDB(快照)文件进行 Redis 数据的备份和还原 Redis 持久化 ...
- 1.mysql读写
一.数据库读取(mysql) 参数 接受 作用 默认 sql or table_name string 读取的表名,或sql语句 无 con 数据库连接 数据库连接信息 无 index_col Int ...
- swing实现QQ登录界面1.0( 实现了同一张图片只加载一次)、(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件)
swing实现QQ登录界面1.0( 实现了同一张图片只加载一次).(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件) 代码思路分析: 1.(同一张图片仅仅需要加载一次就够了,下 ...
- NetCore的缓存使用详例
关于我 作者博客|文章首发 缓存基础知识 缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能和可伸缩性. 缓存最适用于不经常更改的 数据,生成 成本很高. 通过缓存,可以比从数据源返回的数据的 ...
- 利用别名切换索引流程Elasticsearch 7.7
背景 公司里面现在有es集群,由于时间过长,es集群中的某个索引过大但是未删除,一直在写入的情况下,昨天写入突然停止了,发现是索引超时的问题,这时想到通过创建一个新的索引来进行索引切换 操作 es 集 ...