
这个题的限制条件也就是集合中最高位1的位置都一样。所以我们可以考虑桶排(因为在int范围内,所以最多开31个就可以了)。
我没有开桶,就是先排序,然后二分查找+位运算判断相同位最高位为1的情况。
以下是代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define MAXN 1010 using namespace std; int n; int a[MAXN]; inline int maxx(int x) { for(int i=30;i>=0;i--) if(x&(1<<i)) return i; return 0; } inline bool check(int now,int to) { if(maxx(to)>maxx(now)) return false; else return true; } int main() { freopen("subset.in","r",stdin); freopen("subset.out","w",stdout); while(scanf("%d",&n)!=EOF) { int ans=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); for(int i=1;i<=n;i++) { int l=i,r=n; while(l<=r) { int mid=(l+r)>>1; if(check(a[i],a[mid])) l=mid+1; else r=mid-1; } ans=max(ans,l-i); } printf("%d\n",ans); } return 0; }