zoukankan      html  css  js  c++  java
  • 牛客 小a与星际探索 bfs

    链接:https://ac.nowcoder.com/acm/contest/317/C?&headNav=acm
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球。其中每个星球有一个能量指数pp。星球ii能到达星球jj当且仅当pi>pjpi>pj。
    同时小a的飞船还有一个耐久度tt,初始时为11号点的能量指数,若小a前往星球jj,那么飞船的耐久度会变为tpjt⊕pj(即tt异或pjpj,关于其定义请自行百度)
    小a想知道到达nn号星球时耐久度最大为多少
    注意:对于每个位置来说,从它出发可以到达的位置仅与两者的pp有关,与下标无关

    输入描述:

    第一行一个整数nn,表示星球数
    接下来一行有nn个整数,第ii个整数表示pipi

    输出描述:

    一个整数表示到达nn号星球时最大的耐久度
    若不能到达nn号星球或到达时的最大耐久度为00则输出1−1
    示例1

    输入

    复制
    3
    457 456 23

    输出

    复制
    478

    说明

    小a有两种方法到达33号星球
    第一种:1231→2→3,最终耐久度为45745623=22457⊕456⊕23=22
    第二种:131→3,最终耐久度为45723=478457⊕23=478
    示例2

    输入

    复制
    4
    2 4 4 2

    输出

    复制
    -1
    示例3

    输入

    复制
    5
    234 233 123 2333 23

    输出

    复制
    253

    备注:

    1n,pi30001⩽n,∀pi⩽3000


    这个题目可以处理一下,也可以不处理,差不多。

    这个bfs,需要用vis标记一下,这个vis标记,是去标记这个得到的数值。

    这个是为了不超内存,让尽量少的数进入队列。

    还要注意的就是这个题目的理解,应该是只要耐久度大于想去的星球才可以降落。

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #define inf 0x3f3f3f3f
    using namespace std;
    const int maxn = 3e4;
    int a[maxn], b[maxn],k, ans= -1;
    bool vis[maxn];
    int n;
    struct node
    {
    	int id, num;
    	node(int id = 0, int num = 0) :id(id), num(num) {}
    };
    
    void bfs()
    {
    	queue<node>que;
    	que.push(node(1, b[1]));
    	vis[b[1]] = true;
    
    	while (!que.empty())
    	{
    		node u = que.front(); que.pop();
    		int x = u.id, y = u.num;
    		for (int i = 2; i < k; i++)
    		{
    			if (b[i] >= y) continue;
    			if(i==k-1)
    			{
    				ans = max(ans, y^b[i]);
    				continue;
    			}
    			if (vis[y^b[i]]) continue;
    			vis[y^b[i]] = true;
    			que.push(node(i, y^b[i]));
    		}
    	}
    }
    
    int main()
    {
    	k = 1;
    	cin >> n;
    	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    	if (a[1] <= a[n])
    	{
    		printf("-1
    ");
    		return 0;
    	}
    	for (int i = 1; i <= n; i++)
    	{
    		if (a[i] > a[1]) continue;
    		if (a[i] < a[n]) continue;
    		b[k++] = a[i];
    	}
    	bfs();
    	printf("%d
    ", ans);
    	return 0;
    }
    

      

  • 相关阅读:
    最长上升子序列问题总结
    Problem C
    Problem C
    Problem P
    Problem P
    Problem H
    Problem H
    Problem D
    Problem D
    Linux系统调用--getrlimit()与setrlimit()函数详解
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/10561409.html
Copyright © 2011-2022 走看看