小明非常喜欢换钱,这天他想到一个换钱游戏,游戏规则是这样的,从一件价值1元的小物品开始。然后,经过反复的交换,不断增加手中物品的价值。在每次兑换中,如果您的物品价值大于或等于R元,您可以兑换V元,时间成本为T分钟。现在,你的任务是帮助小明兑换到大于等于W元。

输入

第一行中的两个整数N, M (1 <= N <= 10^5, 1 <= M <= 10^9)表示可用交换的数量和最终金钱的期望值。
接下来是N行,每一行描述一个有3个整数Vi, Ri, Ti (1 <= Ri <= Vi <= 10^9, 1 <= Ti <= 10^9)的交换。

输出

输出一个数字,表示最少花费时间,如果不可以完成任务,输出"-1".

数据范围

对于10%的数据,1<= N <= 8, 1 <= M <= 10^9
对于50%的数据,1 <= N<= 1024, 1 <= M <= 10^9
对于100%的数据,1 <= N <= 100000, 1 <= M <= 10^9
1 <= Ri <= Vi <= 10^9, 1 <= Ti <= 10^9

先说一下最初的错误思路:

把每一条输入数据看做一个节点,如果节点A的vi大于另外其他任何节点B的ri值,则在A和B之间建立一条边,权值为兑换B所需要的的时间ti,以最初的价值1为起点建图,跑单源最短路,找到既返回。

是的这个方法的思路按理说是没错的,但是实际上节点相互之间建立的边实在是太多了。最后几组数据全部超空间。

正解:跑单源最短路

有同学要问了,不是说是错误的思路吗?是的,那么优化就是,虽然还是跑最短路,但是边是不需要存储起来的,这样就不会有超空间的问题了。

最短路算法大家都了解(不了解的朋友可以先找一下相关资料),我们只需要不断地找到最优的点,然后以此为跳板更新与之相连的点的数据。在优先队列即最小堆的优化下可以达到nlogn的复杂度。

那么在这道题中我们也在最小堆中维护一个节点node(value,spend)键值是spend,这样每次都从堆顶拿到花费最小的节点,以此为跳板遍历所有数据,判断节点的V和数据堆中数据的R判断可否更新,可以更新的话则在堆中加入新的更新数据,如此当堆顶出现第一个value符合条件的节点,那么speed必然是最小的。

如下:

#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;const int MAX_SIZE=100005;struct node{int value;int spend;node(int _value=0,int _spend=0):value(_value),spend(_spend){}bool operator < (const node &r)const{return spend > r.spend;}};
int V[MAX_SIZE];
int R[MAX_SIZE];
int T[MAX_SIZE];int main(){//freopen("in.text","r",stdin);int n,m;int ans=-1;scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%d%d%d",V+i,R+i,T+i);}priority_queue<node> que;que.push(node(1,0));while(!que.empty()){node temp_node=que.top();que.pop();if(temp_node.value>=m){ans=temp_node.spend;break;}for(int i=0;i<n;i++){if(temp_node.value<V[i]&&temp_node.value>=R[i]){que.push(node(V[i],temp_node.spend+T[i]));}}}printf("%d\n",ans);return 0;
}

3108 小明爱换钱相关推荐

  1. 51nod3108 小明爱换钱

    3108 小明爱换钱 小明非常喜欢换钱,这天他想到一个换钱游戏,游戏规则是这样的,从一件价值1元的小物品开始.然后,经过反复的交换,不断增加手中物品的价值.在每次兑换中,如果您的物品价值大于或等于R元 ...

  2. Python_封装案例(小明爱跑步)

    1.封装的特性和需求分析 封装是面向对象编程的一大特性, 我们在使用面向对象开发程序的时候, 第一步就应该现在需求分析, 然后根据明确的职责把不同的属性和方法封装到一个又一个抽象的类中, 之所以说是抽 ...

  3. Python中面向对象封装案例——小明爱跑步、摆放家具

    文章目录 面向对象封装案例 目标 1. 封装 2. 小明爱跑步 2.1 小明爱跑步扩展 -- 小美也爱跑步 3. 摆放家具 3.1 创建家具 3.2 创建房间 3.3 添加家具 3.4 小结 面向对象 ...

  4. python入门笔记——面向对象基础1_5(小明爱跑步案例)

    案例: 小明爱跑步:实际项目需求如下 ①小明体重 75.0 公斤 ②小明每次跑步 会减少0.5公斤 ③小明每次吃东西 会增加 1公斤 1.案例分析: 名字提炼法,小明--人类: 属性--体重 动词提炼 ...

  5. 2022-6-4 小明爱上课,切木头,最多分成多少块,躲猫猫,争渡

    1. 小明爱上课 [动态规划] 小明非常喜欢上课,现在小明的课表有一些课,他可以通过课表选择上哪些课. 上课会有奖励,每门课上课时间长短不同奖励也会不一样,存在上课时间更长,奖励更少的情况.每一门课上 ...

  6. 51nod3107 小明爱宝石

    3107 小明爱宝石 小明想要创造n种魔法宝石.小明可以用ai的魔力值创造一棵第i种魔法宝石,或是使用两个宝石合成另一种宝石(不消耗魔力值).请你帮小明算出合成某种宝石的所需的最小花费. 输入 首先一 ...

  7. 【51nod】3058 小明爱集合

    小明爱集合 Link 解题思路 因为集合内不会重复,setsetset 不兼容重复,所以直接把所以数据丢到 setsetset 里面,最后 n+mn+mn+m 和剩下数字的差就是重复的个数. code ...

  8. 【树状数组】 小明爱拦截

    [树状数组] 小明爱拦截 题目 解题思路 求最长不上升序列 将导弹高度从大到小排序 以tm的发射时间为下标,将以其结尾的拦截最大值丢进树状数组维护 在当前导弹发射时间前并进了树状数组的(也就是高度比当 ...

  9. 小明爱跑步-扩展-多个对象属性之间互不干扰

    class Person:def __init__(self, name, weight):# self.属性 = 形参self.name = nameself.weight = weightdef ...

最新文章

  1. awk中的NR和FNR
  2. Android 图片黑白显示 自定义饱和度
  3. mysql 帮助命令_一篇文章帮你搞定所有MySQL命令!
  4. flutter对比Android绘制流程,Flutter与android的对比---View
  5. php zip怎么安装,php如何安装zip模块?(方法介绍)
  6. PaperNotes(18)-VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized Representation
  7. java中同时两人提交数据_如何一起发送JSON请求和发布表单数据请求?
  8. kafka发送与接收数据(含奇葩报错解决方案)
  9. hdu 1024(dp)
  10. 禁止屏幕保护使用密码
  11. html代码格式化vscode,Vscode代码格式化
  12. 抽象代数 04.01 群的生成元组
  13. Grid Control 和 Database Control
  14. 谭浩强C++ 第十章
  15. 数据仓库系列(一)什么是维度建模以及维度建模的基本要素
  16. kettle的下载、安装和初步使用(windows平台下)(图文详解)
  17. 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)
  18. 红杉观点|生成式AI:一个创造性的新世界
  19. 做人的基本原则你具备几项(一)
  20. centos linux 和 centos stream 的区别

热门文章

  1. 提高企业内网安全的十大防御策略(转)
  2. QGIS 下载慢解决:
  3. S300V的前世今生
  4. MMGG吃螃蟹 | Solana上去中心化结构性产品-Exotic
  5. 全球与中国远程家庭监控系统市场深度研究分析报告
  6. Android的界面设计规范
  7. 服务器centos7.5系统下配置完DNS可以P通IP不能解析域名
  8. iwconfig 安装_linux下安装无线驱动
  9. 西门子plc使用MQTT把数据上传腾讯云端
  10. macOS 应用崩溃日志