[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 }