【luogu P3403】跳楼机(图论)
跳楼机
题目链接:luogu P3403
题目大意
问你 1~h 中有多少个数可以表示成 ax+by+cz 的形式。
其中 x,y,z 是给出的三个正整数,a,b,c 是你可以选择的非负数。
h≤2^63-1,x,y,z≤10^5
思路
首先列出 O(h)O(h)O(h) 的 DP 式子,但是显然不行,于是考虑优化。
有关 hhh 的复杂度算法似乎没有什么进展,所以考虑另外三个范围小的数。
不妨思考如果只有两个数会怎样?
不难发现如果你确定了当前的数字,然后你只用一个数,那就是可以加上它的任意非负数倍数。
那如果你能凑出 aaa,你就不需要考虑 a+x,a+2x,a+3x,...a+x,a+2x,a+3x,...a+x,a+2x,a+3x,... 这些数是否需要凑出了。
那某种意义上我们只需要考虑 min(x,y,z)\min(x,y,z)min(x,y,z) 个数!
那假设我们用 xxx(因为三个都是同一个级别的),那我们只需要对于模 xxx 等于 0∼x−10\sim x-10∼x−1 的每个情况,我们求出这这些数中,你能求出的最小的数。
(也就是你能求出的是一段后缀,你要找到这段后缀开始的地方)
那怎么找呢?那我们只需要考虑用另外的两个数 y,zy,zy,z 来凑。因为这个时候凑 xxx 没有用了。
那我们可以从 aaa 凑到 (a+y)%x,(a+z)%x(a+y)\%x,(a+z)\%x(a+y)%x,(a+z)%x,那就是一个 f(a+y)%x=min(f(a+y)%x,fa+y),f(a+z)%x=min(f(a+z)%x,fa+z)f_{(a+y)\%x}=\min(f_{(a+y)\%x},f_a+y),f_{(a+z)\%x}=\min(f_{(a+z)\%x},f_a+z)f(a+y)%x=min(f(a+y)%x,fa+y),f(a+z)%x=min(f(a+z)%x,fa+z)
那这个显然可能有环,但是由于是 min\minmin 我们其实会发现它其实可以看做一个最短路!
然后跑最短路就能求出 fff,对于每个位置你计算一下后缀的长度,就是总共的答案了。
代码
#include<queue>
#include<cstdio>
#include<cstring>
#define ll long longusing namespace std;const int N = 1e5 + 100;
ll h, f[N];
int x, y, z;
priority_queue <pair<ll, int>, vector<pair<ll, int> >, greater<pair<ll, int> > > q;
bool in[N];int main() {scanf("%lld", &h);scanf("%d %d %d", &x, &y, &z);memset(f, 0x7f, sizeof(f)); f[0] = 1; q.push(make_pair(f[0], 0));while (!q.empty()) {int now = q.top().second; q.pop();if (in[now]) continue; in[now] = 1;int to = (now + y) % x;if (f[to] > f[now] + y) {f[to] = f[now] + y; q.push(make_pair(f[to], to));}to = (now + z) % x;if (f[to] > f[now] + z) {f[to] = f[now] + z; q.push(make_pair(f[to], to));}}ll ans = 0;for (int i = 0; i < x; i++) {if (f[i] > h) continue;ans += (h - f[i]) / x + 1;}printf("%lld", ans);return 0;
}
【luogu P3403】跳楼机(图论)相关推荐
- 同余最短路(P3403 跳楼机)
同余最短路 前置 给定m个数,这m个数可以重复取,问最大的这m个数不能拼成的数,或者给定一定范围,范围里有多少个数是这m个数可以拼成的,对于这种问题我们可以考虑同余最短路的算法. P3403 跳楼机 ...
- P3403 跳楼机 同余最短路
传送门 题意: 思路: 转换一下题目就是用若干x,y,zx,y,zx,y,z能凑出来多少个<=h<=h<=h的数.先考虑两个数y,zy,zy,z的情况,我们如果能求出来这两个数能凑出 ...
- 【洛谷 P3403】跳楼机(SPFA)
P3403 跳楼机 题目背景 DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧. 题目描述 Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机, ...
- 【洛谷3043】跳楼机(最短路)
[洛谷3043]跳楼机(最短路) 题面 洛谷 题解 思路很妙嗷. 先只考虑只用\(y,z\)两种移动方式,它们一定能够到达一些楼层, 那么这些楼层再只用\(x\)拓展就能够计算答案. 那么我们这样子计 ...
- 【JZOJ A组】跳楼机
Description DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧. Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方 ...
- 机器人无限火力无限e符文_无限火力装备符文评级 召唤师峡谷秒变欢乐谷 机器人化身跳楼机...
无限火力模式激情上线,拥有80%超快冷却缩减的BUFF,一切都和召唤师峡谷不同.那么在无限火力模式中,哪些装备符文能拥有更为亮眼的表现呢? 装备篇 无限火力最爽的一点就是--装备也能够享受80%的冷却 ...
- 最短路模型-跳楼机-洛谷P3403
第一次遇到这种数学题转化为图论的题目,与我一开始的想法相同,将其中一个变量与另外两个变量分离开来,便于处理.由于以前一直认为SPFA会被卡,所以使用了堆优化的Dijkstra,结果超时了,为什么呢?因 ...
- JZOJ #4722 跳楼机 (最短路模型的完美转化)
题目描述: 给出$h,x,y,z$,求在$h$以内,$x,y,z$可以凑出多少个不同的数.$(1\leq{h}\leq{10^{18}},1\leq{x,y,z}\leq{10^5})$ 解题思路: ...
- JZOJ4722 跳楼机 巧妙地转换为最短路模型
题目大意 有一个 H H高的楼房,现在给你三个正整数x,y,zx,y,z表示,在每一层 i i,你有4种选择,到i+xi+x, i+y i+y, i+z i+z层或第 1 1层.问能到多少个楼层. H ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
最新文章
- 安防行业为何缺少真正适用的AI芯片?
- Java Activiti 工作流引擎 流程审批 后台框架源码 springmvc SSM
- 《嵌入式linux应用程序开发标准教程》笔记——7.进程控制开发
- Android小項目之---ListView实现论坛管理效果(附源碼)
- eclipse xhtml文件 标签自动提示 问题解决
- Java 如何设置时间_如何在Java中设置尊重用户操作系统设置的日期和时间格式
- java堆栈_Java堆栈– Java堆栈
- 关于逻辑或的一个小小应用注意点
- 面试官:谈谈分布式一致性机制,我一脸懵逼。。
- 工程数学线性代数第六版答案与解析,《线性代数附册学习辅导与习题全解》
- 奥鹏教育计算机应用基础试题及答案,奥鹏计算机应用基础试题及答案.pdf
- 关于PDF文件加密无法打印的问题
- 弹球小游戏c语言编程,scratch丨(1) 弹球小游戏
- Vue 在使用v-if的前提下,使用elementResizeDetector配合ref获取元素块的高度
- 学习python需要很多数学知识吗_Python数据分析需要学习哪方面的数学知识
- 李小龙传奇一生的资料(多图)
- 蓝桥杯 ADV-201 VIP试题 我们的征途是星辰大海(试题解析)
- mysql normsinv_软件教程热搜榜_最新软件教程热门新闻_软件教程资讯大全-PC下载网资讯网...
- java程序将多张图片合成一张
- 机器学习入门级实例——针对葡萄酒质量进行建模