Animals
蒟蒻

Day6-T2

原题目

  给你一个长度为n的序列A,请求出最大的一对数(A,Aj),使Ai&Aj最大。

  第一行为n,接下来n行,每一个数表示Ai.

  输出最大的“and”。

S1:

  Input:

3
8
10
2

  Output:

8

 


 

  Describe:暴枚当然会T成狗,所以我们考虑剪枝

  code:

#include<bits/stdc++.h>
#define INF 214748364
#define eps 1e-9
#define rep1(a,b) for(register long long i=(a);i<=(b);i++)
#define rep2(a,b) for(register long long j=(a);j<=(b);j++)
using namespace std;
long long a[500101],n,ans;
inline long long read(){
	long long ret=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();}
	while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
	return ret*f;
}
inline double read2(){
    double X=0,Y=1.0;long long w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=X*10+(ch^48),ch=getchar();
    ch=getchar();
    while(isdigit(ch)) X+=(Y/=10)*(ch^48),ch=getchar();
    return w?-X:X;
}
inline void write(long long x){
	if(x<0){putchar('-');write(-x);return;}
    if(x/10) write(x/10);putchar(x%10+'0');
}
int main(){
	//freopen("carpet.in","r",stdin);
    //freopen("carpet.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	sort(a+1,a+n+1);for(int i=1;i<n;i++)if(a[i]==a[i+1])ans=a[i];            //如果两个数相等,至少是这两个数的值。[从小到大--SORT]
	for(int i=n;i>=1;i--){                                                   //从大到小枚以便剪枝
		for(int j=n;j>=i+1;j--){                                         //同上
			if(a[j]<=ans)break;                                      //若A<B,则A&C[C∈R]<=A<B
			ans=max(ans,a[i]&a[j]);                                  //取最大值
		}
		if(a[i]<=ans)break;                                              //嗯哼
	}
	write(ans);
	return 0;
}

  

posted @ 2018-11-05 15:03  年下丶  阅读(137)  评论(0编辑  收藏  举报
--- 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 ---