• P1135 奇怪的电梯


    题目描述

    呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1iN)上有一个数字Ki(0KiN)。电梯只有四个按钮:开,关,上,下。

    上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3,3,1,2,5代表了K_i(K_1=3,K_2=3,…),从1楼开始。

    1楼,按“上”可以到4楼,按“下”是不起作用的,因为没有2楼。那么,从A楼到B楼至少要按几次按钮呢?

    输入输出格式

    输入格式:

     

    共二行。

    第一行为3个用空格隔开的正整数,表示N,A,B(1N200,1A,BN)。

    第二行为N个用空格隔开的非负整数,表示K_i

     

    输出格式:

     

    一行,即最少按键次数,若无法到达,则输出1。

    输入输出样例

    输入样例#1: 复制
    5 1 5
    3 3 1 2 5
    
    输出样例#1: 复制
    3

     

    SPFA板子题,关键就是思路要转化过来,

    它可以不是单纯的搜索,而是看作一个最短路问题,

    起点为a,每次的u可以是1到n每一个点,v呢?

    这就要看题目了,1到n每一层所能到达的要么往下:i-k[i],要么往上:i+k[i],且必须在1到n范围内,

    所以判断一下是否满足要求,就能知道v是多少了,这个最短路的话,边权都为1;

    其余就都是SPFA的板子了。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N=100002;
    
    int n,u,a,b,num;
    int front[N],dis[N];
    bool vis[N];
    queue<int>q;
    
    struct node{
    	int v,nxt;
    }e[N<<1];
    
    int read()
    {
    	int x=0;
    	char ch=getchar();
    	while(ch<'0'||ch>'9')
    		ch=getchar();
    	while(ch>='0'&&ch<='9')
    	{
    		x=x*10+ch-'0';
    		ch=getchar();
    	}
    	return x;
    }
    
    void add(int u,int v,int w)
    {
    	num++;
    	e[num].v =v;
    	e[num].nxt =front[u];
    	front[u]=num;
    }
    
    void spfa()
    {
    	memset(dis,0x3f,sizeof(dis));
    	dis[a]=0;
    	vis[a]=1;
    	q.push(a);
    	int u,v;
    	while(!q.empty() )
    	{
    		u=q.front() ;
    		q.pop() ;
    		vis[u]=0;
    		for(int i=front[u];i;i=e[i].nxt )
    		{
    			v=e[i].v ;
    			if(dis[v]>dis[u]+1 )
    			{
    				dis[v]=dis[u]+1 ;
    				if(!vis[v])
    				{
    					vis[v]=1;
    					q.push(v); 
    				}
    			}
    		}
    	 } 
    }
    
    int main()
    {
    	n=read(),a=read(),b=read();
    	for(int i=1;i<=n;++i)
    	{
    		u=read();
    		if(i+u>0&&i+u<=n) add(i,i+u,1);
    		if(i-u>0&&i-u<=n) add(i,i-u,1);
    	}
    	spfa();
    	printf("%d",dis[b]==0x3f3f3f3f?-1:dis[b]);
    	return 0;
    }

    如果你不开心,那我就把右边这个帅傻子分享给你吧,  

    你看,他这么好看,那么深情的望着你,你还伤心吗?  

    真的!这照片盯上他五秒钟就想笑了。  

    一切都会过去的。 

  • 相关阅读:
    Apache ab并发负载压力测试(python+django+mysql+apache)
    Python+Django 后台view异步接不到参数问题
    java报错 pom.xml第一行报"org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project...
    国内Maven仓库地址
    【转载】Java枚举的使用
    搭建SSM环境(淘淘商城)
    【转载】使用appium遇到的坑
    【maven】Description Resource Path Location Type An error occurred while filtering resources TESTVIDEO line
    Maven配置
    【转载】linux下的zookeeper启动
  • 原文地址:https://www.cnblogs.com/Mary-Sue/p/9679714.html
Copyright © 2020-2023  润新知