洛谷P3403 跳楼机(最短路)
题目背景
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 跳楼机(最短路)相关推荐
- 【洛谷 P3403】跳楼机(SPFA)
P3403 跳楼机 题目背景 DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧. 题目描述 Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机, ...
- 同余最短路(P3403 跳楼机)
同余最短路 前置 给定m个数,这m个数可以重复取,问最大的这m个数不能拼成的数,或者给定一定范围,范围里有多少个数是这m个数可以拼成的,对于这种问题我们可以考虑同余最短路的算法. P3403 跳楼机 ...
- 最短路模型-跳楼机-洛谷P3403
第一次遇到这种数学题转化为图论的题目,与我一开始的想法相同,将其中一个变量与另外两个变量分离开来,便于处理.由于以前一直认为SPFA会被卡,所以使用了堆优化的Dijkstra,结果超时了,为什么呢?因 ...
- P3403 跳楼机 同余最短路
传送门 题意: 思路: 转换一下题目就是用若干x,y,zx,y,zx,y,z能凑出来多少个<=h<=h<=h的数.先考虑两个数y,zy,zy,z的情况,我们如果能求出来这两个数能凑出 ...
- 用0和5凑被90整除的max数(洛谷P2192题题解,Java语言描述)
题目要求 P2192题目链接 分析 盘一盘各种情况吧: 要被90整除,就必须被10整除,所以必须有0,没0就是-1啊. 要被90整除,一堆5,靠0是没用的,只能是9个5凑一堆儿才有用,有0但凑不够9个 ...
- 超级玛丽游戏(洛谷-P1000)
题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. ********************####.... ...
- 洛谷——P1000 超级玛丽游戏
P1000 超级玛丽游戏 题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 另外强烈推荐新用户必读贴 题目描述 超级玛丽是一个非常经典的游戏. ...
- 洛谷P1000 超级玛丽游戏C++题解
首先我们看这道题的题目"超级玛丽游戏",第一道题就让我们写个游戏出来.结果点进去一看,顿时觉得这道题是在开玩笑,本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续 ...
- 洛谷 P2388 阶乘之乘 题解
博客园同步 原题链接 简要题意: 求 ∏ i = 1 n ∏ j = 1 i j \prod_{i=1}^n \prod_{j=1}^i j ∏i=1n∏j=1ij 的末尾有几个零. 显然,我们对 ...
- 【模拟】洛谷 P1000 超级玛丽游戏
题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...
最新文章
- css中的垂直居中方法
- 判断变量是否为数组的几种方法
- 【[CQOI2018]交错序列】
- [I2C]I2C总线协议图解
- **23.m阶的B-树和B+树的主要区别
- 堆排序分析(大根堆为例,由小到大排序)
- c语言怎么判定结构体有无数据,C语言中什么是结构体,怎么定义结构体。
- 计算机文献双语外文,中英文双语计算机专业毕业设计外文文献翻译成品:对Delphi的概述.docx...
- Android插件化开发之动态加载三个关键问题详解
- 随笔--互联网进化论
- VC++中Format用法
- scrapy爬虫循环抓取同一个url,避免同一URL使爬虫关闭
- 黄聪:Wordpress3.2去除url中的category(不用插件实现)
- Android网络请求通信之Volley
- OLEDB, ODEB, ADO.NET Abbreviation
- Date对象中的方法
- 【天梯选拔月赛】经典算法之过河问题+(倒水问题--见链接)
- 计算机病毒的一些印象
- Java实现获取汉字的拼音(首拼)
- idea添加xsd文件