A:度度熊就是要刷排名第一
-
时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
一天度度熊在Baidu游戏大厅中发现了一个隐藏的神奇游戏,叫做”度度熊的逆袭”。度度熊很好奇到底是什么情况,于是就进入了游戏。这个游戏很神奇,游戏会给出n个数Ai,度度熊可以任意从中选取一些数,一个数可以选任意多次。选好之后度度熊得到的分数为度度熊选出的数的Xor(异或)值。度度熊顿时产生了兴趣,决心要刷至Ranklist的第一名。但是度度熊犯难了,度度熊不知道自己给出的方案是不是最好的,于是度度熊找到了你,希望你告诉他对于某个回合,度度熊能得到的最高分和第二高分是多少?
输入
-
第1行1个数n,接下来1行n个整数表示Ai, (0 <= Ai < 2^31, 并且
)
1 <= n <= 10^5
输出
- 输出一行两个数,表示度度熊能够得到的最高分和第二高分为多少 样例输入
-
2
5 3
样例输出
-
6 5
首先说一下,这个代码是错的。。。。。。。。。。。这道题是HDU上原题,我一开始不知道 55555555555555。这道题求最大的异或值套的模板,然后次大值如此考虑的,应该就是最大值再异或一个,多一个或者少一个。。。。。。。。。但是错了 诶
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
unsigned int array[100100],array2[100100];
int main(void)
{
int n;
cin>>n;
for(int i=0;i<n;++i)
cin>>array[i];
sort(array,array+n);
for(int i=n-1;i>0;--i)
array2[i]=array[i]^array[i-1];
unsigned int maxnum=array2[1],now=array2[1];
for(int i=2;i<n;++i)
{
now=max(array2[i],now^array2[i]);
maxnum=max(now,maxnum);
}
if(n==1)
maxnum = array[0];
int maxnum2 = array[n-1];
for(int i=0;i<n;++i)
{
int temp = maxnum^array[i];
if(temp>maxnum2)
maxnum2 = temp;
}
if(maxnum2>maxnum)
{
int temp = maxnum;
maxnum = maxnum2;
maxnum2 = temp;
}
cout<<maxnum<<" "<<maxnum2<<endl;
return 0;
}