题目链接:

http://172.16.0.132/senior/#main/show/4722

题目:

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

题解:

一开始$h--$,把第1层给减掉方便处理

40分的做法是直接bfs统计方案数,但是这样状态数太多太大了,考虑简化方案数

定义$d_i=c$,$c$表示最小的只由操作2,3得到的且满足$c \mod x = i$的数

那么答案$ans=\sum_{i=0}^{x-1} (\lfloor \frac{h-d_i}{x} \rfloor+1)$

为什么呢?我们考虑将合法的楼层按模x分类,显然余数是由操作2,3得到的。那么我们考虑得到了最小的楼层,比它大的所有的在这个剩余系里的楼层都可以得到,而比它小的绝对得不到

按模x分类做到了不重,取完后面所有的数做到了不漏

考虑$d_i$怎么计算,显然有

$$d_{k+y}=d_k+y$$

$$d_{k+z}=d_k+z$$

这是一个最短路模型,跑一次spfa就好了

时间复杂度怎么算呢?我也没太弄懂

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;const int N=1e5+15;
const ll inf=1e18;
ll h,x,y,z;
int vis[N];
ll d[N];
void spfa()
{queue <int> q;for (ll i=0;i<x;i++) d[i]=inf;d[0]=0;q.push(0);vis[0]=1;while (!q.empty()){ll k=q.front();q.pop();vis[k]=0;if (d[(k+y)%x]>d[k]+y) {d[(k+y)%x]=d[k]+y;if (!vis[(k+y)%x]) q.push((k+y)%x),vis[(k+y)%x]=1;}if (d[(k+z)%x]>d[k]+z) {d[(k+z)%x]=d[k]+z;if (!vis[(k+z)%x]) q.push((k+z)%x),vis[(k+z)%x]=1;}}
}
int main()
{scanf("%lld%lld%lld%lld",&h,&x,&y,&z);--h;spfa();ll ans=0;for (ll i=0;i<x;i++) if (h>d[i]) ans+=(h-d[i])/x+1;printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/xxzh/p/9844459.html

[jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)相关推荐

  1. JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串

    Description 科学家温斯顿从数据库中找到了一串相当长的字符串. 他正试图用一个模板串来重构这个字符串. 他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致. 如果两个模板 ...

  2. JZOJ 4675. 【NOIP2016提高A组模拟7.21】Double-row

    Description 科学家温斯顿在一张超长的白纸上写下了两行数,每一行数有N个. 但他写完后觉得看起来有点不和谐.他希望重新编排,使得每一行数中没有相同的数. 他每次可以调换同一列的两个数. 请帮 ...

  3. 【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题

    题目描述 在麦克雷的面前有N个数,以及一个R*C的矩阵.现在他的任务是从N个数中取出R*C个,并填入这个矩阵中.矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值.现在, ...

  4. JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球

    Description 小A有n个球,编号分别为1到n,小A每次都会从n个球中取出若干个球,至少取一个,至多取n个,每次取完再放回去,需要满足以下两个条件. 每次取出的球的个数两两不同. 每次取出的球 ...

  5. JZOJ 4726. 【NOIP2016提高A组模拟8.22】种花

    Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场--南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...

  6. JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症

    Description Input Sample Input 3 2 2 1 Output Sample Output 3 样例解释: Data Constraint Solution 首先,我们设之 ...

  7. jzoj 4805. 【NOIP2016提高A组模拟9.28】跟踪 {树+dfs}

    题目 解题思路 不难发现,石神和两个陌生人的行动方式一定是最优策略. 转换一下思路,考虑对于每个点,石神是否能比两个陌生人先到达. 计算石神到达每个点的最早时间,以及两个陌生人到达每个点的最早时间. ...

  8. JZOJ 4798 【NOIP2016提高A组模拟9.24】天使的分裂

    天使的分裂 题目大意 同时满足 求 ∑ni=1Fi \sum_{i=1}^{n}F_i 数据范围 题解 题目很简单,但是看上去很难. 先将F的递推式推出来. 所以递推式为 Fn F_n= Fn−1 F ...

  9. JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护

    题目大意 给定一个长度小于等于kk的字符串和qq,表示现在有qq个操作,每个操作给定两个参数li,ril_i,r_i表示把现在的字符串第lil_i到rir_i把其中编号为奇数的按顺序写下来,再在后面把 ...

  10. 【NOIP2016提高A组模拟9.9】闭门造车

    题目 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应过来 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(十五)-运动学-正向运动学和反向运动学(其二)-DH参数等
  2. python爬虫百科-Python爬虫之requests库介绍(一)
  3. Spring中类路径下文件读取方式
  4. mfc 监控文件操作_mfc是什么
  5. 索引 - 数据结构 - B+TREE
  6. html状态查询爱站,批量获取爱站数据
  7. 【Leetcode】Python实现字符串转整数 (atoi) - 详细备注,保证小白看懂
  8. Rails测试《十》不能错过的杂七杂八
  9. mysql 5.7.19 rpm下载_centos6.8 mysql5.7 rpm安装与完全卸载
  10. JAVA收到网络报文的IP是::1,怎么回事?
  11. 王之泰201771010131《面向对象程序设计(java)》第二周学习总结
  12. matlab中内插cubic,cubic与spline插值点处的区别
  13. Jquery实现弹幕效果
  14. matplotlib库的pyplot的plot()函数详解
  15. git push -u origin XXX 报错
  16. Hadoop之使用LZO压缩并支持分片
  17. 建立自己的机器人手臂-组装
  18. 在SQL中修改数据库名称
  19. Python调用高德地图API实现经纬度换算、地图可视化
  20. 简单计算机基础知识,计算机基础知识讲义

热门文章

  1. BW数据加载后不能实时刷新到水晶易表解决方法
  2. 01GOF23-创建模型式
  3. 计算机软件著作权可以查询他人的源代码和申请材料吗?
  4. JAVA 之父高斯林:廉颇老矣,尚能饭否?
  5. (二)注释(comment)详解
  6. Android之Intent详解
  7. English - 英语中的时间表达法,这里全啦!
  8. 看看老毛子士兵干的事情!
  9. c语言tc2.0编译器下载,c语言编译器|c语言编译器(wintc)_绿茶手机网
  10. c语言tc环境下while多大,求救,wintc环境下,写了程序,调试不出来,先谢谢了...