poj 3539 Elevator——同余类bfs
题目:http://poj.org/problem?id=3539
考虑把层数分为模a剩余系。同类内可通过+若干个a走到。
不同类之间需要通过+b、+c来走到。
需要求出每一类中最小的能走到的。即最短路。
注意memset成0x3f!不要直接memset成1!
仔细一看,long long下赋1是17位,赋0x3f是19位。而h是18位。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N=1e5+;
ll h,dis[N],ans;
int a,b,c,head[N],xnt;
bool vis[N];
struct Ed{
int next,to,w;
Ed(int n=,int t=,int z=):next(n),to(t),w(z) {}
}ed[N<<];
void dj()
{
memset(dis,0x3f,sizeof dis);dis[%a]=;//%a //0x3f
priority_queue<pair<ll,int> > q;
q.push(make_pair(-,%a));
while(q.size())
{
int k=q.top().second;q.pop();
while(q.size()&&vis[k])k=q.top().second,q.pop();
if(vis[k])break;vis[k]=;
for(int i=head[k],v;i;i=ed[i].next)
if(dis[k]+ed[i].w<dis[v=ed[i].to])
{
dis[v]=dis[k]+ed[i].w;q.push(make_pair(-dis[v],v));
}
}
}
int main()
{
scanf("%lld%d%d%d",&h,&a,&b,&c);
for(int i=;i<a;i++)
{
ed[++xnt]=Ed(head[i],(i+b)%a,b);head[i]=xnt;
ed[++xnt]=Ed(head[i],(i+c)%a,c);head[i]=xnt;
}
dj();
for(int i=;i<a;i++)if(dis[i]<=h)ans+=(h-dis[i])/a+;//<=h
printf("%lld",ans);
return ;
}
dj
再来个跑得快的(spfa)。
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+;
ll ans,h,dis[N];
int a,b,c,q[N<<],hd,tl;
bool vis[N];
int main()
{
scanf("%lld%d%d%d",&h,&a,&b,&c);
if(a<b)swap(a,b);if(a<c)swap(a,c);
memset(dis,0x3f,sizeof dis);dis[%a]=;
hd=;q[++tl]=;vis[%a]=;
while(hd<=tl)
{
int k=q[hd++];vis[k]=;
if(dis[(k+b)%a]>dis[k]+b)
{
dis[(k+b)%a]=dis[k]+b;
if(!vis[(k+b)%a])q[++tl]=(k+b)%a,vis[(k+b)%a]=;
}
if(dis[(k+c)%a]>dis[k]+c)
{
dis[(k+c)%a]=dis[k]+c;
if(!vis[(k+c)%a])q[++tl]=(k+c)%a,vis[(k+c)%a]=;
}
}
for(int i=;i<a;i++)if(dis[i]<=h)ans+=(h-dis[i])/a+;
printf("%lld",ans);
return ;
}
poj 3539 Elevator——同余类bfs的更多相关文章
- [poj 3539] Elevator (同余类bfs)
Description Edward works as an engineer for Non-trivial Elevators: Engineering, Research and Constru ...
- poj3539 Elevator——同余类bfs
题目:http://poj.org/problem?id=3539 题目大意是给定 a, b, c,求 1~h 内有多少个数可以被 a, b, c 通过加减法组成: 这是今天刚讲的神奇的——同余类 b ...
- [POJ] 3539 Elevator
http://poj.org/problem?id=3539 给定一个电梯,可以上升a,b,c层和回到1层,给定楼高h,求可达层数 lyd讲的同余类BFS,方法是先把三个量压成两个,即把h%a,因为对 ...
- 同余类BFS的一些瞎吹
同余类BFS的题,是个OIer基本上都会见过一些,最好的例子就是NOIP 2018 day1 T2---货币系统 虽然这题其实是什么背包就能解决的题目,但数据一变大,出题人坏一点,就没了.... 同 ...
- POJ 3539 Elevator(同余类BFS)
题意 有一部电梯,最初停在1层. 电梯有4个按键,上升a,b,c层,回到一层. 求从一层出发.能到达1~h的哪些楼层. (h<=1018,a,b,c<=105) 题解 这种h能大的图论,一 ...
- BZOJ2118: 墨墨的等式(同余类BFS)(数学转为图论题)
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2944 Solved: 1206[Submit][Status][Discu ...
- POJ 1324 Holedox Moving (状压BFS)
POJ 1324 Holedox Moving (状压BFS) Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 18091 Acc ...
- Luogu4156 WC2016 论战捆竹竿 KMP、同余类最短路、背包、单调队列
传送门 豪华升级版同余类最短路-- 官方题解 主要写几个小trick: \(1.O(nm)\)实现同余类最短路: 设某一条边长度为\(x\),那么我们选择一个点,在同余类上不断跳\(x\),可以形成一 ...
- POJ.1426 Find The Multiple (BFS)
POJ.1426 Find The Multiple (BFS) 题意分析 给出一个数字n,求出一个由01组成的十进制数,并且是n的倍数. 思路就是从1开始,枚举下一位,因为下一位只能是0或1,故这个 ...
随机推荐
- Introduction to vSphere Integrated Containers
vSphere Integrated Containers enables IT teams to seamlessly run traditional workloads and container ...
- File类之在指定目录中查找文件
package IoDemo; import java.io.File; /** * @Title:FileDemo2 * @Description:在指定的目录中查找文件 * @author Cra ...
- 安装,配置webpack.
1.下载node.js 2.在需要用到webpack的项目下打开命令窗口运行npm init生成package.js 3.安装webpack,使用npm install webpack --save- ...
- QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言
1.效果如下图,开启就自动检测系统语言,选择系统语言显示, UI有控件设置,在中文和英文之间切换.. 2. 源码 dialog.h #ifndef DIALOG_H #define DIALOG_H ...
- 在虚拟机里安装ubuntu
1.下载ubuntu镜像文件 https://mirrors.aliyun.com/ubuntu-releases/17.04/ubuntu-17.04-desktop-amd64.iso 2.创建虚 ...
- Linux 软链接操作项目
项目添加软链 ln -s 源文件 目标文件 指令 ln -s /home/wwwroot/default/nikon/panda/pc ./pc ln -s /home/wwwroot/default ...
- 红米1S.线刷
ZC:遇到问题:“Missmatching image and device”,解决网址:“[2.23][史上最全]MiFlash线刷错误的那些事儿_收藏备用_小米手机4_MIUI论坛.html”(h ...
- nova shelve
当一个虚机不需要使用的时候,可以将其 shelve 起来.该操作会创建该虚机的一个快照并传到 Glance 中,然后在 Hypervisor 上将该虚机删除,从而释放其资源. 其主要过程为: dest ...
- js+css实现简单下拉菜单
<head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu ...
- java: InputStreamReader将字节的输入流变成字符的输入流,OutputStreamWriter将字符的输出流变成字节的输出流
InputStreamReader:将字节的输入流变成字符的输入流, OutputStreamWriter:将字符的输出流变成字节的输出流 //将缓冲区的内容读取,可以一次读取 //可以接收键盘的输入 ...