zoukankan      html  css  js  c++  java
  • 【洛谷3043】跳楼机(最短路)

    【洛谷3043】跳楼机(最短路)

    题面

    洛谷

    题解

    思路很妙嗷。
    先只考虑只用(y,z)两种移动方式,它们一定能够到达一些楼层,
    那么这些楼层再只用(x)拓展就能够计算答案。
    那么我们这样子计算答案,设(dis[i])表示可以到达(mod x=i)的楼层的最小值,
    显然这个玩意可以最短路求,那么直接建图跑(SPFA)(死不掉的),然后统计一下答案。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<queue>
    using namespace std;
    #define ll long long
    #define MAX 100100
    struct Line{int v,next,w;}e[MAX<<2];
    int h[MAX],cnt=1;
    inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
    ll H,ans;
    int x,y,z;
    ll dis[MAX];
    bool vis[MAX];
    void SPFA()
    {
    	memset(dis,63,sizeof(dis));dis[1%x]=1;
    	queue<int> Q;Q.push(1%x);vis[1%x]=true;
    	while(!Q.empty())
    	{
    		int u=Q.front();Q.pop();
    		for(int i=h[u];i;i=e[i].next)
    		{
    			int v=e[i].v;
    			if(dis[v]>dis[u]+e[i].w)
    			{
    				dis[v]=dis[u]+e[i].w;
    				if(!vis[v])vis[v]=true,Q.push(v);
    			}
    		}
    		vis[u]=false;
    	}
    }
    int main()
    {
    	cin>>H>>x>>y>>z;
    	for(int i=0;i<x;++i)
    	{
    		Add(i,(i+y)%x,y);
    		Add(i,(i+z)%x,z);
    	}
    	SPFA();
    	for(int i=0;i<x;++i)
    		if(dis[i]<=H)ans+=(H-dis[i])/x+1;
    	cout<<ans<<endl;
    	return 0;
    }
    
    
  • 相关阅读:
    java内部类
    navicat使用教程-PJ
    提交代码时的注意事项
    多线程技术
    Apache POI使用详解
    网站链接收藏夹
    MySQL优化
    Oracle创建用户、角色、授权、建表
    oracle 安装提示未找到文件安装
    Json对象与Json字符串的转化、JSON字符串与Java对象的转换
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9558011.html
Copyright © 2011-2022 走看看