[JZOJ4274] 终章-剑之魂

Description

  【题目描述】
  My soul of my sowrd!
  终焉的试炼即将到来,作为一名有修养的剑士,虽然没有习得n刀流但是二刀流还是没问题的。然而我也是个剑的收藏者,家里屯着n把剑,每一把剑都有一个灵魂值a[i],由于一些剑之间可能有共鸣,所以我需要两把契合度最高的剑。据剑圣所说,两把编号为i,j剑的契合度为a[i] and a[j]。如何深得剑的灵魂呢?
  注:AND 为按位与运算,先将数转成二进制,不满位数的补全0,然后成为两个长度相同的二进制数,处理的时候,两个相应的二进制位都为1,该位的结果值才为1,否则为0。例下图。

Input

  第一行一个整数n,代表藏剑数。
  第二行n个整数,第i个整数表示a[i]。

Output

  输出包含一个正整数,最好的两把剑的契合度。

Sample Input

  5
  12 5 6 3 1

Sample Output

  4
  【样例解释】
  5 and 6=4或者12 and 5=4或者12 and 6=4

Data Constraint

  对于40%的数据 n ≤ 1,000
  对于100%的数据 n ≤ 1,000,000,0 ≤ a[i] < 2^31

Summary

  可以发现,要尽量选高位的1,这样比低位全都是1还大,那么我们要选两个较大的a[i],可以先给a从大到小排序,再n^2枚举,比已有答案小就break。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 long long a[1500000];
 5 int n;
 6 int main()
 7 {
 8     freopen("sword.in","r",stdin);
 9     freopen("sword.out","w",stdout);
10     scanf("%d",&n);
11     for (int i=1;i<=n;i++)
12         scanf("%lld",&a[i]);
13     sort(a+1,a+n+1);
14     long long max=0;
15     for (int i=n;i>=2;i--)
16         if ((a[i]&a[i-1])>=max)
17                 max=a[i]&a[i-1];
18         else break;
19     printf("%d",max);
20     fclose(stdin);fclose(stdout);
21 }
View Code

 

posted @ 2018-07-16 09:02  kasiruto  阅读(78)  评论(0编辑  收藏