Day6-T2
原题目
给你一个长度为n的序列A,请求出最大的一对数(Ai ,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; }