题目背景

DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧。

题目描述

Srwudi的家是一幢h层的摩天大楼。由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方便的上楼。
经过改造,srwudi的跳楼机可以采用以下四种方式移动:
向上移动x层;
向上移动y层;
向上移动z层;
回到第一层。
一个月黑风高的大中午,DJL来到了srwudi的家,现在他在srwudi家的第一层,碰巧跳楼机也在第一层。DJL想知道,他可以乘坐跳楼机前往的楼层数。

输入格式

第一行一个整数h,表示摩天大楼的层数。
第二行三个正整数,分别表示题目中的x, y, z。

输出格式

一行一个整数,表示DJL可以到达的楼层数。

输入

15
4 7 9

输出

9

输入

33333333333
99005 99002 100000

输出

33302114671

提示

可以到达的楼层有:1,5,8,9,10,12,13,14,15
想不出来不要死磕这一题,先看看第三题。。。。
1<=h<=\(2^{63}\)-1
1<=x, y, z<=100000


假设可以到达的楼层为t
我们可以得到一个方程:t=ax+by+cz
如果设t'=by+cz,原方程就变成了t=a'x+t'

f[i]表示表示仅通过操作2和操作3能到达的mod x == i的最小楼层t'
(这里为什么要是最小楼层呢,举个栗子:x == 5时,7和12都满足mod x == 2.而12 = 7 +5,表示12层可以被后面讨论操作一的时候枚举到)
注意:一定要把f[i]的i与f[i]的含义分开,i是f[i] mod x的结果,即i == f[i]%x

状态转移方程:

f[i+y] = f[i]+y;
f[i+z] = f[i]+z;

最短路方程:

dis[b]=dis[a]+Len[a][b];

我们把f[i+z]看做dis[b],把f[i]看做dis[a],将z看做b[(i+z)%x]点和a[i]点之间的边权(y同理)
在这里,(i+y)%x的是防止i+y超过x

建图过程:

void add(int x,y,a){End[++tot]=y;Len[tot]=a;Next[tot]=Last[x];Last[x]=tot;
}
……
for(int i=0;i<x;i++){//i从0到x-1add(i,(i+y)%x,y);add(i,(i+z)%x,z);
}

因为是求最小楼层t',所以用SPFA/Dijkstra解决

通过SPFA/Dijkstra,我们已经求出了仅通过操作2和操作3能到达的mod x == i的最小楼层t'

那么就可以很快的求出还剩几层楼可以跳:(h - f[i]),从而推出剩下仅通过操作一可以跳的楼层个数:(h - f[i])/x(向下取整,因为不能跳超过h层)
再通过ans与它之间的联系算出答案:ans += (h - f[i])/x + 1(剩下可以跳的楼层个数+f[i]本身这一层楼)

一个问题:如果到达f[i]之前有经过其他点,那么从ans += (h - f[i])/x + 1来看,并没有将到达f[i]之前经过的点的个数计入答案,是否存在漏算?
举个栗子来解释:

x=8,y=3,z=5,h=100
f[7]=1+3+3=7

i == 7
ans = ans + (h-f[7])/x+1 == ans + (100-7)/7 +1 == ans + 14
作为“中转站”:第4楼能够达到,却并没有被算在ans里
回过头去看i == 4
ans = ans + (h-f[4])/x+1 == ans + (100 - 4)/7+1 == ans + 9
也就是说,第4楼在算第7楼之前就已经算过了,再次计入ans只会使答案出现重复

最后吐槽一下,这是一道省选难度的Noip模拟题
【因为蹲在墙角所以有回声的小声bbbbbbbbbbbbbbb...】

转载于:https://www.cnblogs.com/qwqq/p/11251055.html

洛谷P3403 跳楼机(最短路)相关推荐

  1. 【洛谷 P3403】跳楼机(SPFA)

    P3403 跳楼机 题目背景 DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧. 题目描述 Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机, ...

  2. 同余最短路(P3403 跳楼机)

    同余最短路 前置 给定m个数,这m个数可以重复取,问最大的这m个数不能拼成的数,或者给定一定范围,范围里有多少个数是这m个数可以拼成的,对于这种问题我们可以考虑同余最短路的算法. P3403 跳楼机 ...

  3. 最短路模型-跳楼机-洛谷P3403

    第一次遇到这种数学题转化为图论的题目,与我一开始的想法相同,将其中一个变量与另外两个变量分离开来,便于处理.由于以前一直认为SPFA会被卡,所以使用了堆优化的Dijkstra,结果超时了,为什么呢?因 ...

  4. P3403 跳楼机 同余最短路

    传送门 题意: 思路: 转换一下题目就是用若干x,y,zx,y,zx,y,z能凑出来多少个<=h<=h<=h的数.先考虑两个数y,zy,zy,z的情况,我们如果能求出来这两个数能凑出 ...

  5. 用0和5凑被90整除的max数(洛谷P2192题题解,Java语言描述)

    题目要求 P2192题目链接 分析 盘一盘各种情况吧: 要被90整除,就必须被10整除,所以必须有0,没0就是-1啊. 要被90整除,一堆5,靠0是没用的,只能是9个5凑一堆儿才有用,有0但凑不够9个 ...

  6. 超级玛丽游戏(洛谷-P1000)

    题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. ********************####.... ...

  7. 洛谷——P1000 超级玛丽游戏

    P1000 超级玛丽游戏 题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 另外强烈推荐新用户必读贴 题目描述 超级玛丽是一个非常经典的游戏. ...

  8. 洛谷P1000 超级玛丽游戏C++题解

    首先我们看这道题的题目"超级玛丽游戏",第一道题就让我们写个游戏出来.结果点进去一看,顿时觉得这道题是在开玩笑,本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续 ...

  9. 洛谷 P2388 阶乘之乘 题解

    博客园同步 原题链接 简要题意: 求 ∏ i = 1 n ∏ j = 1 i j \prod_{i=1}^n \prod_{j=1}^i j ∏i=1n​∏j=1i​j 的末尾有几个零. 显然,我们对 ...

  10. 【模拟】洛谷 P1000 超级玛丽游戏

    题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...

最新文章

  1. css中的垂直居中方法
  2. 判断变量是否为数组的几种方法
  3. 【[CQOI2018]交错序列】
  4. [I2C]I2C总线协议图解
  5. **23.m阶的B-树和B+树的主要区别
  6. 堆排序分析(大根堆为例,由小到大排序)
  7. c语言怎么判定结构体有无数据,C语言中什么是结构体,怎么定义结构体。
  8. 计算机文献双语外文,中英文双语计算机专业毕业设计外文文献翻译成品:对Delphi的概述.docx...
  9. Android插件化开发之动态加载三个关键问题详解
  10. 随笔--互联网进化论
  11. VC++中Format用法
  12. scrapy爬虫循环抓取同一个url,避免同一URL使爬虫关闭
  13. 黄聪:Wordpress3.2去除url中的category(不用插件实现)
  14. Android网络请求通信之Volley
  15. OLEDB, ODEB, ADO.NET Abbreviation
  16. Date对象中的方法
  17. 【天梯选拔月赛】经典算法之过河问题+(倒水问题--见链接)
  18. 计算机病毒的一些印象
  19. Java实现获取汉字的拼音(首拼)
  20. idea添加xsd文件

热门文章

  1. 第四周作业上(2014.3.31)
  2. 夜神模拟器安装证书后无效问题解决
  3. 个人保研经历以及经验分享
  4. oracle数据库lpad,Oracle数据库之oracle中的decode的使用LPAD
  5. launch参数JAVA_javafx主要方法launch(args)如何工作? - java
  6. SaleSmartly注册登录教程
  7. chrome下载提示网络错误
  8. ionic4 click防抖指令
  9. 配置Linaro toolchain交叉编译工具
  10. 2021高考自贡成绩查询,多图|自贡2021高考进行时