题意:
      给你一个有向图,每个节点上都有一个盐价,然后给你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. Java黑皮书课后题第3章:3.7(金融应用:整钱兑零)修改程序清单2-10,使之只显示非零的币值单位,用单词的单数形式显示一个单位,复数形式显示多于一个的单位的值

    3.7(金融应用:整钱兑零)修改程序清单2-10,使之只显示非零的币值单位,用单词的单数形式显示一个单位,复数形式显示多于一个的单位的值 题目 题目概述 程序清单2-10(非本题代码) 破题/思路:这 ...

  2. 第三章第七题(金融应用:整钱兑零)(Financial application: monetary units)

    3.7(金融应用:整钱兑零)修改程序清单2-10,使之只显示非零的币值单位,用单词的单数形式显示一个单位,例如1dollar and 1 penny(1美元和1美分):用单词的复数形式显示多于一个单位 ...

  3. 整钱换零钱问题。把1元换成1分、2分、5分的硬币,共有多少种不同的换法(C语言)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: [实验体验] 1.整钱换零钱问题.把1元换成1分.2分.5分的硬币,共有多少种不同的换法. 提示:设5分币个数为i(0-20) ...

  4. 10元倍数的整钱换1元、2元、5元的零钱组合C语言

    将一面额为10元倍数的整钱(<=100元)换成1元.2元和5元的零钱组合(每种面值都要有).输入要换的面额(如10元),输出所有可能的换法及其数量.要求输出要依次按5元.2元.1元的数量从多到少 ...

  5. java编写一个整钱换零_Java编写钱币转换为大写程序

    import java.text.DecimalFormat; public class ChangeMonney { private static final String[] STR_UNIT = ...

  6. 公司因为薪资问题,走了一个各方面都不错的老工人,花更多的钱招来一个跨行业新手,这是为什么?

    其实这是私企当中普遍存在的问题,也是很现实的问题,其实一家公司里并不是所有的岗位都需要老员工的.有句话说得好,企业用人并不是要用最优秀的,而是要用最合适的!我们逐一分析就明白为什么公司会这样做了! 一 ...

  7. C语言零钱换整钱*——穷举

    小明手中有硬币,小红手中有若干张10元的纸币.已知 1 角硬币厚 1.8mm,5 角硬币厚 1.5mm,1 元硬币厚 2.0mm .小红拿出若干张10元的纸币,小明要将 1 角的硬币放成一摞,将 5 ...

  8. python整钱换零钱_一知半解讲Python第二季:7.钞票兑换

    一道让我怀疑人生的题 CCF NOI1034 钞票兑换. 时间限制: 1000 ms 空间限制: 262144 KB 题目描述 将任意给定的整百元钞票,兑换成10元.20元.50元小钞票形式.输出兑换 ...

  9. python整钱兑换零钱while语句_关于python:如何将钱(便士)转换为单个硬币?

    我的任务是 "编写一个功能selectCoins,要求用户输入金额 (以便士为单位),然后输出每种面额的硬币数量(从£ 2向下 到1p)应该用来精确地补足该金额(使用尽可能少的 硬币数量). ...

最新文章

  1. 专访中国移动钱岭:大数据更像是一种“倍增器”
  2. 如何让控件span的id调用ajax_微服务架构之「 调用链监控 」
  3. 【学习笔记】JS基础语法一小时通
  4. 现在电脑的主流配置_玩手游是因为电脑配置差?现在来告诉你这些网游需要啥配置...
  5. 2009年浙江大学计算机及软件工程研究生机试真题
  6. HH SaaS电商系统的商品物流模板的功能设计
  7. 前端学习(3154):react-hello-react之脚手架文件介绍
  8. Adobe illustrator 排版后图形导出 - 连载 3
  9. mysql-查询二-分组与聚合
  10. linux脚本中空格怎么显示,linux vim 显示空格
  11. Redis 常用命令(学习笔记二)
  12. 如何在Java中将字节数组转换为十六进制字符串?
  13. 加速Web开发的9款知名HTML5框架
  14. 计算机软件销售适用增值税税率,计算机软件研发企业要交什么税,税率是多少...
  15. 从哥尼斯堡“七桥问题”到盖洛普“优势识别器”
  16. APP版本更新通知流程图
  17. linux端口映射到内网机器,linux如何将公网IP映射到局域网IP?
  18. dumprep.exe 进程吃掉一半CPU
  19. STM32 I2S学习(一)
  20. 计算机支架式教学案例,万紫千红总是春--支架式教学(网友来稿)

热门文章

  1. 关于Yii2中CSS,JS文件的引入心得
  2. Flask与Ajax
  3. 拥抱开源IaaS云平台:360度盘点OpenStack
  4. C#连接ORACLE数据库乱码问题
  5. 黑马vue---14、v-model双向绑定
  6. 用一个栈实现另一个栈的排序
  7. Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别
  8. FormShortCut MainForm 和 二级FORM
  9. Swift结构体与类
  10. ORACLE 11GR2 RAC的网络规划解析