题目描述

Srwudi的家是一幢h层的摩天大楼。由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方便的上楼。
经过改造,srwudi的跳楼机可以采用以下四种方式移动:

  • 向上移动x层;
  • 向上移动y层;
  • 向上移动z层;
  • 回到第一层。
    一个月黑风高的大中午,DJL来到了srwudi的家,现在他在srwudi家的第一层,碰巧跳楼机也在第一层。
    DJL想知道,他可以乘坐跳楼机前往的楼层数。

题解

首先,我们需要思考一下两个数应该怎么解决:若数为x和y。

  • x:x+y,x+2y,x+3y...x:x+y,x+2y,x+3y...x:x+y,x+2y,x+3y...
  • 2x:2x+y,2x+2y,2x+3y...2x:2x+y,2x+2y,2x+3y...2x:2x+y,2x+2y,2x+3y...
  • 3x:3x+y,3x+2y,3x+3y...3x:3x+y,3x+2y,3x+3y...3x:3x+y,3x+2y,3x+3y...

大体的枚举方式就是这样的。但是我们会发现,这样的枚举效率不是很高。

例如,当3x−x%y=03x-x\ \%\ y\ =\ 03x−x % y = 0时,3x3x3x后的枚举就是无效的,因为会被若干个y填充。

所以最后的结果就是,求得若干个kx%ykx\ \%\ ykx % y 不同的kkk,ans=∑h−k∗xyans=\sum \ \frac{h-k*x}{y}ans=∑ yh−k∗x​。

对于三个数,思路也是一样的。求解的是ax+by+cz+1≤hax+by+cz+1≤hax+by+cz+1≤h的情况。

设f(i)f(i)f(i)表示(by+cz)%z=i(by+cz)\ \%\ z\ =\ i(by+cz) % z = i时,bx+czbx+czbx+cz的最小值。

  • f(i)+y=f((i+y)%z)f(i)+y=f((i+y)\ \%\ z)f(i)+y=f((i+y) % z)
  • f(i)+z=f((i+z)%z)f(i)+z=f((i+z)\ \%\ z)f(i)+z=f((i+z) % z)

这样一个式子,正好对应了一个最短路的模型。以1为起点跑最短路就能够得到相应的fff值。

同理,ans=∑h−fiyans=\sum \ \frac{h-f_{i}}{y}ans=∑ yh−fi​​。

这道题其实我们,对于同余的题,从其重复性中找到一些优化求解的方法;若能够列出图论迭代式的形式,则可以用图论来求出相应的模型值。而这道题的主要难点就是根据数学模型建模,以最短路的形式辅助求解。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>
#include<limits.h>
#include<algorithm>
#define LL long long
#define Mp make_pairusing namespace std;LL h,x,y,z,ans=0;
LL v[200000];
LL dis[200000];
priority_queue< pair<LL,LL> >q;
vector< pair<LL,LL> >a[200000];int main(void)
{freopen("srwudi.in","r",stdin);freopen("srwudi.out","w",stdout);cin>>h>>x>>y>>z;if (x == 1 || y == 1 || z == 1){cout<<h<<endl;return 0;}for (LL i=0;i<x;++i){a[i].push_back(Mp((i+y)%x,y));           a[i].push_back(Mp((i+z)%x,z));}memset(dis,30,sizeof(dis));dis[1]=1;q.push(Mp(1,1));while (q.size()){LL now=q.top().second;q.pop();if (v[now] == 1) continue;v[now]=1;for (LL i=0;i<a[now].size();++i){LL next=a[now][i].first,val=a[now][i].second;if (dis[now]+val < dis[next]){dis[next]=dis[now]+val;q.push( Mp(-dis[next] , next) );}}}for (LL i=0;i<x;++i)if (h-dis[i] >= 0) ans+=(h-dis[i])/x+1;cout<<ans<<endl;return 0;
}

【图论·习题】同余最短路:跳楼机相关推荐

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

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

  2. 【洛谷3043】跳楼机(最短路)

    [洛谷3043]跳楼机(最短路) 题面 洛谷 题解 思路很妙嗷. 先只考虑只用\(y,z\)两种移动方式,它们一定能够到达一些楼层, 那么这些楼层再只用\(x\)拓展就能够计算答案. 那么我们这样子计 ...

  3. 【算法笔记】一步一步推出来的同余最短路优化思路(千字长文,超详细)

    整理的算法模板合集: ACM模板 目录 同余最短路 例题1:luogu P3403 跳楼机 例题2:luogu P2371 [国家集训队]墨墨的等式 例题3:luogu P2662 牛场围栏 同余最短 ...

  4. 【学习笔记】同余最短路

    同余最短路是用来解决一类 ∑i=1naixi∈[L,R]\sum_{i=1}^n a_ix_i\in[L,R]∑i=1n​ai​xi​∈[L,R] 问题的方法. 其中 L,RL,RL,R 值非常大,而 ...

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

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

  6. 【JZOJ A组】跳楼机

    Description DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧. Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方 ...

  7. 【NOIP模拟题】【DP】【同余最短路】【暴力剪枝】2016.11.15 第二题 小L的牛栏 题解

    小L的牛栏 [题目描述] 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕不?).勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后,凭着 ...

  8. 牛客 - Yuki with emofunc and playf(同余最短路)

    题目链接:点击查看 题目大意:初始时给出一个数字 y=1y=1y=1 和一个辅助数字 xxx,每回合可以执行两种操作中的一种: y=y∗10y=y*10y=y∗10 y=y+x−1y=y+x-1y=y ...

  9. P2662 牛场围栏(同余最短路)

    P2662 牛场围栏 思路 假设我们已经知道同余最短路是什么了,这里就不再过多赘述. 我们要尽可能地得到更多地课建成地边,那么我们必然要选一个basebasebase相对小的,因此我们可以对所有的棍子 ...

  10. 湖南大学第十六届程序设计竞赛 B Yuki with emofunc and playf 同余最短路

    传送门 文章目录 题意: 思路: 题意: 初始有一个数111,你每次可以将其∗10*10∗10或者+(x−1)+(x-1)+(x−1),现在给你xxx,问最少经过多少步能到达nnn. 1≤n≤1e6, ...

最新文章

  1. Android Build.VERSION.SDK_INT
  2. 分布式之消息队列复习精讲
  3. 互联网1分钟 |1217
  4. mac 用惠普扫描仪扫描提示将对您的电脑造成伤害_惠普全能打印神器测评:15秒智能闪充、打一张仅需5分钱...
  5. 感谢Adobe,用上了Silverlight RC0版本
  6. [css] 你有用过clip-path吗?说说你对它的理解和它都有哪些运用场景?
  7. win32开发(自定义消息)
  8. UVA10738 Riemann vs Mertens【欧拉筛法】
  9. 关于STC8H8K64U单片机IAP升级过程
  10. python截取视频制作gif表情包
  11. 已有一个已排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中。
  12. 学习强国-为中华崛起而学习
  13. 程序猿必知英语词汇总结
  14. 获取门店出错(44)美团聚宝盆 门店映射报错
  15. 【转】Fluent学习笔记(10)-----多相流模型
  16. method属性值为get提交表单信息,为什么在地址栏不会显示呢。
  17. Linux下通过Shell脚本快速进入指定目录
  18. 【CarMaker学习笔记】TestManager自动测试实验
  19. kddcup99预处理matlab,KDD CUP99数据集预处理(Python实现)-Go语言中文社区
  20. 第七章 对话框1 windows程序设计 王艳平版

热门文章

  1. 树莓派HDMI转VGA线有无源
  2. ROS2 中的 launch 文件入门的 6 个疑问
  3. 淘宝京东苏宁易购:网商时代的角逐
  4. GHOST备份还原系统教程
  5. 利用Google快讯和GoogleReader收集信息
  6. Codeforces1183 E. Subsequences (easy version)(bfs)
  7. 【研一周小结】第八-九周个人学习总结
  8. 抖音短剧本应该怎么写
  9. Linux 别名设置,可一键登入服务器- alias
  10. 【问】历史库存查询的结存数量和商品进销存报表的结存数量对不上