
這個題的限制條件也就是集合中最高位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; }