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

小a正在玩一款星际探索游戏,小a需要驾驶着飞船从1号星球出发前往n号星球。其中每个星球有一个能量指数p。星球i能到达星球j当且仅当pi>pj。
同时小a的飞船还有一个耐久度t,初始时为1号点的能量指数,若小a前往星球j,那么飞船的耐久度会变为t⊕pj(即t异或pj,关于其定义请自行百度)
小a想知道到达n号星球时耐久度最大为多少

注意:对于每个位置来说,从它出发可以到达的位置仅与两者的p有关,与下标无关

输入描述:

第一行一个整数n,表示星球数
接下来一行有n个整数,第i个整数表示pi

输出描述:

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

输入

复制

3
457 456 23

输出

复制

478

说明

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

输入

复制

4
2 4 4 2

输出

复制

-1
示例3

输入

复制

5
234 233 123 2333 23

输出

复制

253

备注:

1⩽n,∀pi⩽3000

这题很明显线性基,但是一开始做的时候没有看到 pi 必须大于 pj 这条限制条件 就直接打了,打完发现样例不过,自己也看不懂样例。
重新读了一遍题才发现那个条件,果然电子竞技不需要视力。
只需要把P0作为最大值 Pn-1作为最小值,处理出来新的数组,然后再线性基最大值就行了。 也可以用暴力dp 。
处理出来新的数组,并排序。将本题的移动方式更改为:
从第一个点走到最后一个点,可以自由选择是否在当前点异或(第一个点和最后一个点除外)
dp[i][j] 表示 走到第i个点 并 进行完是否在i处异或的抉择之后,值能否为 j
此代码为线性基的代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int arr[];
int stu[];
int p[];
int main(){
int n;
int cnt=;
int ans;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&arr[i]);
}
if(arr[]<=arr[n-]){
puts("-1");
return ;
}
ans = arr[]^arr[n-];
for(int i=;i<n-;i++){
if(arr[n-] < arr[i] && arr[i] < arr[])
stu[cnt++] = arr[i];
}
memset(p,,sizeof(p));
for(int i=;i<cnt;i++){
for(int j=;j>=;j--){
if(stu[i]>>j&){
if(p[j]){
stu[i] ^= p[j];
}else {
p[j] = stu[i];
break;
}
}
}
}
for(int i=;i<;i++){
for(int j=i+;j<;j++){
if(p[j]>>i&)p[j]^=p[i];
}
}
for(int i=;i<;i++){
if(ans < (ans ^ p[i]))
ans ^= p[i];
}
printf("%d\n",ans);
return ;
}

此为dp代码。

#include   <cstdio>
#include <cstring>
#include<algorithm>
using namespace std; const int maxn = (<<);
int arr[];
int stu[];
bool dp[][maxn];
bool cmp(int a,int b){
return a > b;
}
int main(){
int n;
int cnt=;
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d",&arr[i]);
if(arr[]<=arr[n-]){
puts("-1");
return ;
}
stu[cnt++] = arr[];
stu[cnt++] = arr[n-];
for(int i=;i<n-;i++){//处理出新数组
if(arr[n-] < arr[i] && arr[i] < arr[])
stu[cnt++] = arr[i];
} sort(stu,stu+cnt,cmp);
dp[][stu[]]=;
for(int i=;i<cnt;i++){
if(i==cnt-){//最后一个点
for(int j=maxn-;j;j--){
// 从大到小 遍历所有可能的 j 值
dp[i][j] |= dp[i-][j ^ stu[i]];
if(dp[i][j]){printf("%d\n",j);return ;}
}
}else if(stu[i]==stu[i-]){
//因为和前一个点的值一样,所以dp的结果也一样
memcpy(dp[i],dp[i-],sizeof(dp[i]));
}else{
for(int j=;j<maxn;j++){
// 在i点的 j 值可以由i-1处用(j^stu[i])这个值来异或stu[i]得到
// 也可以由 i-1处的j值不在i处异或stu[i]得到
dp[i][j] |= dp[i-][j^stu[i]] | dp[i-][j];
}
}
}
puts("-1");
return ;
}

牛客 小a与星际探索的更多相关文章

  1. 牛客 小a与星际探索 bfs

    链接:https://ac.nowcoder.com/acm/contest/317/C?&headNav=acm来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...

  2. 小a与星际探索

    链接:https://ac.nowcoder.com/acm/contest/317/C来源:牛客网 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球.其中每个星球有一个能 ...

  3. 小a与星际探索---DP

    题目描述 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球.其中每个星球有一个能量指数pp.星球ii能到达星球jj当且仅当pi>pjpi>pj.同时小a的飞船还 ...

  4. 牛客-小a的旅行计划 + 数学推导

    小a的旅行计划 题意: 小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为,同时小b也想出去游玩.由于一些特殊♂原因,他们的旅行计划必须满足一些条件 首先,他们可以从这N个景点中任意选 ...

  5. 牛客-小y的盒子

    题目传送门 -------------------稍加观察就会发现,4n - 1就是题目要的答案.至于为什么,看官方的题解.不过这个n非常的大,用正常快速幂解决不了.这道题我学到的就是解决幂非常大的情 ...

  6. 牛客-小w的a=b问题

    题目传送门 sol1:老实做,预处理出所有2到1e5的素数,对所有数进行分解质因数,然后对比因子个数.感觉有点卡常,用了快读然后多次优化之后才过的,map也用上了. 素数筛,快速分解质因数 #incl ...

  7. 牛客小白月赛13 小A买彩票 (记忆化搜索)

    链接:https://ac.nowcoder.com/acm/contest/549/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 牛客小白月赛13-J小A的数学题 (莫比乌斯反演)

    链接:https://ac.nowcoder.com/acm/contest/549/J来源:牛客网 题目描述 小A最近开始研究数论题了,这一次他随手写出来一个式子,∑ni=1∑mj=1gcd(i,j ...

  9. 牛客OI周赛7-提高组 A 小睿睿的等式

    链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...

随机推荐

  1. 最短路径问题:弗洛伊德算法(Floyd)

    Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...

  2. JavaEE权限管理系统的搭建(七)--------管理用户的增删改

    本小结讲解管理用户的增删改查实现, 首先是添加用户,如下图所示,可以看到添加用户的同时也要给用户分配角色,至少给用户分配一个或者是多个角色 页面js部分: $.ajax({ //几个参数需要注意一下 ...

  3. Spring知识点总结(一)

       1. 框架概述        所谓的框架其实就是程序的架子,在这个程序的架子中,搭建起程序的基本的骨架,针对程序的通用问题给出了便捷的解决方案,可以使开发人员 基于框架快速开发具体的应用程序.  ...

  4. 节约内存:Instagram的Redis实践

    Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Inst ...

  5. .Net core NPOI导入导出Excel

    最近在想.net core NPOI 导入导出Excel,一开始感觉挺简单的,后来真的遇到很多坑.所以还是写一篇博客让其他人少走一些弯路,也方便忘记了再重温一遍.好了,多的不说,直接开始吧. 在.Ne ...

  6. PHP | Uploading and reading of files and database 【PHP | 文件的上传和读取与数据库】

    这是我自己的一个作业,用的是很基础的代码. 有错误的地方欢迎批评和指正! 这里最容易出错的地方在读取数据后向数据库表中插入数据是的数据格式! 文件上传的页面 uploading.php <htm ...

  7. javaweb--json--ajax--mysql实现省市区三级联动(附三级联动数据库)

    在web中,实现三级联动很常见,尤其是利用jquery+json.但是从根本上来说jquery并不是最能让人容易理解的,接下来从最基本的javascript开始,实现由javascript+json+ ...

  8. laravel 基础 --内置函数

    简介 Laravel 自带了一系列 PHP 辅助函数,很多被框架自身使用,如果你觉得方便的话也可以在代码中使用它们. https://laravelacademy.org/post/8967.html ...

  9. Java基础——继承和多态

    面向对象的编程允许从已经存在的类中定义新的类,这称为继承. 面向过程的范式重点在于方法的设计,而面向对象的范式将数据和方法结合在对象中.面向对象范式的软件设计着重于对象以及对象上的操作.面向对象的方法 ...

  10. C语言:类型、运算符、表达式

    看了一天书,有点累了.就写写随笔记录一下今天的复习成果吧. C语言的基本数据类型 数值型:整型数,浮点数,布尔数,复数和虚数. 非数值型:字符. 整数最基本的是int,由此引出许多变式诸如有符号整数s ...