[jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)
题目链接:
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+同余)相关推荐
- JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串
Description 科学家温斯顿从数据库中找到了一串相当长的字符串. 他正试图用一个模板串来重构这个字符串. 他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致. 如果两个模板 ...
- JZOJ 4675. 【NOIP2016提高A组模拟7.21】Double-row
Description 科学家温斯顿在一张超长的白纸上写下了两行数,每一行数有N个. 但他写完后觉得看起来有点不和谐.他希望重新编排,使得每一行数中没有相同的数. 他每次可以调换同一列的两个数. 请帮 ...
- 【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题
题目描述 在麦克雷的面前有N个数,以及一个R*C的矩阵.现在他的任务是从N个数中取出R*C个,并填入这个矩阵中.矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值.现在, ...
- JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球
Description 小A有n个球,编号分别为1到n,小A每次都会从n个球中取出若干个球,至少取一个,至多取n个,每次取完再放回去,需要满足以下两个条件. 每次取出的球的个数两两不同. 每次取出的球 ...
- JZOJ 4726. 【NOIP2016提高A组模拟8.22】种花
Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场--南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...
- JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症
Description Input Sample Input 3 2 2 1 Output Sample Output 3 样例解释: Data Constraint Solution 首先,我们设之 ...
- jzoj 4805. 【NOIP2016提高A组模拟9.28】跟踪 {树+dfs}
题目 解题思路 不难发现,石神和两个陌生人的行动方式一定是最优策略. 转换一下思路,考虑对于每个点,石神是否能比两个陌生人先到达. 计算石神到达每个点的最早时间,以及两个陌生人到达每个点的最早时间. ...
- JZOJ 4798 【NOIP2016提高A组模拟9.24】天使的分裂
天使的分裂 题目大意 同时满足 求 ∑ni=1Fi \sum_{i=1}^{n}F_i 数据范围 题解 题目很简单,但是看上去很难. 先将F的递推式推出来. 所以递推式为 Fn F_n= Fn−1 F ...
- JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护
题目大意 给定一个长度小于等于kk的字符串和qq,表示现在有qq个操作,每个操作给定两个参数li,ril_i,r_i表示把现在的字符串第lil_i到rir_i把其中编号为奇数的按顺序写下来,再在后面把 ...
- 【NOIP2016提高A组模拟9.9】闭门造车
题目 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应过来 ...
最新文章
- Udacity机器人软件工程师课程笔记(十五)-运动学-正向运动学和反向运动学(其二)-DH参数等
- python爬虫百科-Python爬虫之requests库介绍(一)
- Spring中类路径下文件读取方式
- mfc 监控文件操作_mfc是什么
- 索引 - 数据结构 - B+TREE
- html状态查询爱站,批量获取爱站数据
- 【Leetcode】Python实现字符串转整数 (atoi) - 详细备注,保证小白看懂
- Rails测试《十》不能错过的杂七杂八
- mysql 5.7.19 rpm下载_centos6.8 mysql5.7 rpm安装与完全卸载
- JAVA收到网络报文的IP是::1,怎么回事?
- 王之泰201771010131《面向对象程序设计(java)》第二周学习总结
- matlab中内插cubic,cubic与spline插值点处的区别
- Jquery实现弹幕效果
- matplotlib库的pyplot的plot()函数详解
- git push -u origin XXX 报错
- Hadoop之使用LZO压缩并支持分片
- 建立自己的机器人手臂-组装
- 在SQL中修改数据库名称
- Python调用高德地图API实现经纬度换算、地图可视化
- 简单计算机基础知识,计算机基础知识讲义
热门文章
- BW数据加载后不能实时刷新到水晶易表解决方法
- 01GOF23-创建模型式
- 计算机软件著作权可以查询他人的源代码和申请材料吗?
- JAVA 之父高斯林:廉颇老矣,尚能饭否?
- (二)注释(comment)详解
- Android之Intent详解
- English - 英语中的时间表达法,这里全啦!
- 看看老毛子士兵干的事情!
- c语言tc2.0编译器下载,c语言编译器|c语言编译器(wintc)_绿茶手机网
- c语言tc环境下while多大,求救,wintc环境下,写了程序,调试不出来,先谢谢了...