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. hdoj1001【智障了。。。】

    我不得不写这样一发,来提醒自己,本来是想在xixi面前1minAC,然后: 我没有用long long. wa一发 他告诉我每个案例后都要再加一个空行,没看见PE一 #include<iostr ...

  2. sql server通过脚本进行数据库压缩全备份的方法

    问题:生产环境的数据库可能比较大,如果直接进行全备而不压缩的话,备份集就会占用了大量磁盘空间.给备份文件的存放管理带来不便. 解决方案:通过with compression显式启用备份压缩,指定对此备 ...

  3. Visual Studio 的Build Event 使用

    rmdir Configuration mkdir Configuration Copy "$(ProjectDir)Configuration\Spec.config" &quo ...

  4. win10家庭版安装

    https://www.microsoft.com/zh-cn/software-download/windows10ISO https://www.2cto.com/os/201704/621770 ...

  5. Differentiation 导数和变化率

    何为导数 1 : 如何求一条直线上一点的切线? what did we learn in high school about what a tangent(切) line is ? :任意一点上的切线 ...

  6. 跟我一起玩Win32开发(6):创建右键菜单

    快捷菜单,说得容易理解一点,就是右键菜单,当我们在某个区域内单击鼠标右键,会弹出一些菜单项.这种类型的菜单,是随处可见的,我们在桌面上右击一下,也会弹出一个菜单. 右键菜单的好处就是方便,它经常和我们 ...

  7. scikit-learning API

    API参考 这是scikit学习的类和函数参考.有关详细信息,请参阅完整的用户指南,因为类和功能原始规格可能不足以给出其使用的完整指导. sklearn.base:基类和效用函数 所有估计器的基类. ...

  8. Educational Codeforces Round 24 A

    There are n students who have taken part in an olympiad. Now it's time to award the students. Some o ...

  9. magento package

    Magento Local module file is relative to app/code/local/ Magento Community module file is relative t ...

  10. java 环境变量的设置,备忘

    新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0变量名:CLASSPATH 变量值:.;%JAVA ...