http://poj.org/problem?id=3539

给定一个电梯,可以上升a,b,c层和回到1层,给定楼高h,求可达层数

lyd讲的同余类BFS,方法是先把三个量压成两个,即把h%a,因为对于一个x∈{h%a},若x可达,则x+ak一定可达。

然后考虑在这个模a的剩余系中,b和c的情况。

从1开始连边,从点i连向(i+w)%a,代价为w,其中w为b或c。

意义就是,对于一个楼层x,从x到达最近x+w层的代价为w,这很显然。

从1开始做单源最短路,然后只需要统计dis小于等于h的,大于的显然不可达了。

因为是在模a剩余系下做的,所以对于一个满足dis[u]<=h的u,它是一个剩余系的代表元,要算出剩余系大小。

//drunk,fix later
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue> using namespace std; typedef long long ll; const int MAXN=; struct Edge{
int next,to;
ll w;
}e[MAXN<<];
int ecnt,head[MAXN];
inline void add(int x,int y,ll w){
e[++ecnt].next = head[x];
e[ecnt].to = y;
e[ecnt].w = w;
head[x] = ecnt;
} ll h,a,b,c; queue<int> Q;
int inq[MAXN];
ll dis[MAXN];
void spfa(){
for(int i=;i<=a;i++) dis[i]=1ll<<;
Q.push();inq[]=;dis[]=;
while(!Q.empty()){
int top=Q.front();Q.pop();inq[top]=;
for(int i=head[top];i;i=e[i].next){
int v=e[i].to;
if(dis[v]>dis[top]+e[i].w){
dis[v]=dis[top]+e[i].w;
if(!inq[v]) Q.push(v),inq[v]=;
}
}
}
} int main(){
cin>>h>>a>>b>>c;
if(a>b) swap(a,b);
if(a>c) swap(a,c);
if(a==) return cout<<h,;
for(int i=;i<a;i++){
add(i,(i+b)%a,b);
add(i,(i+c)%a,c);
}
ll sum=;
spfa();
for(int i=;i<a;i++) if(dis[i]<=h) sum+=(ll)(h-dis[i])/a+;
cout<<sum;
return ;
}

[POJ] 3539 Elevator的更多相关文章

  1. poj 3539 Elevator——同余类bfs

    题目:http://poj.org/problem?id=3539 考虑把层数分为模a剩余系.同类内可通过+若干个a走到. 不同类之间需要通过+b.+c来走到. 需要求出每一类中最小的能走到的.即最短 ...

  2. [poj 3539] Elevator (同余类bfs)

    Description Edward works as an engineer for Non-trivial Elevators: Engineering, Research and Constru ...

  3. POJ 3539 Elevator(同余类BFS)

    题意 有一部电梯,最初停在1层. 电梯有4个按键,上升a,b,c层,回到一层. 求从一层出发.能到达1~h的哪些楼层. (h<=1018,a,b,c<=105) 题解 这种h能大的图论,一 ...

  4. HDU 2494/POJ 3930 Elevator(模拟)(2008 Asia Regional Beijing)

    Description Too worrying about the house price bubble, poor Mike sold his house and rent an apartmen ...

  5. poj 2392 Space Elevator(多重背包+先排序)

    Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...

  6. POJ 2392 Space Elevator(贪心+多重背包)

    POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num ...

  7. poj[2392]space elevator

    Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...

  8. POJ 2392 Space Elevator DP

    该题与POJ 1742的思路基本一致:http://www.cnblogs.com/sevenun/p/5442279.html(多重背包) 题意:给你n个电梯,第i个电梯高h[i],数量有c[i]个 ...

  9. POJ 2392 Space Elevator(多重背包变形)

    Q: 额外添加了最大高度限制, 需要根据 alt 对数据进行预处理么? A: 是的, 需要根据 alt 对数组排序 Description The cows are going to space! T ...

随机推荐

  1. Jquery Validate不是用submit按钮提交表单,使用a标签js代码都可以

    不多说,上代码. $("#form").validate(); $("#btn").click(function() { if($("#form&qu ...

  2. useradd user 错误解决

    今天给安装Sequoiadb 软体时,出现添加用户和组失败,显示错误: cannot lock /et/passwd; try again later. 在网上查了一下,说是/etc/passwd 文 ...

  3. Eclipse显示空白符,及使用google代码格式化

    启动Eclipse,打开Preferences对话框.菜单“window”-“Preferences”. 找到Text Editors,勾选show whitespace characters,如图: ...

  4. CF982C Cut 'em all!

    思路: 在深搜过程中,贪心地把树划分成若干个连通分支就可以了.划分的条件是某个子树有偶数个节点.注意到在一次划分之后并不需要重新计数,因为一个数加上一个偶数并不影响这个数的奇偶性. 实现: #incl ...

  5. intellij idea 调试 lua程序, 突然崩溃或者xmx不够的情况

    将内存各方面的数值都改大一点.都什么时代了,默认数值还这么低... -server-Xms256m-Xmx1024m-XX:ReservedCodeCacheSize=240m-XX:+UseConc ...

  6. JS进阶-特殊形式的函数-返回函数的函数/重写自己的函数

    返回函数的函数 // 返回函数的函数 function a() { alert("aa"); return function () { alert("bb"); ...

  7. MY $MYVIMRC

    set nocompatiblesource $VIMRUNTIME/vimrc_example.vim"source $VIMRUNTIME/mswin.vim"behave m ...

  8. 《深入理解Java虚拟机》读书笔记

    堆分配参数: -XX:+PrintGC 使用该参数,虚拟机启动后,只要遇到GC就会打印日志: -XX:+UseSerialGC 配置串行回收器: -XX:+PrintGCDeltails 可以查看详细 ...

  9. 洛谷 P2319 [HNOI2006]超级英雄

    题目描述 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一 ...

  10. hdu 2192 MagicBuilding

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...