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

  

猜你喜欢

转载自www.cnblogs.com/sroht/p/9909199.html
今日推荐