A:容易发现这要求所有子集中元素的最高位1的位置相同,并且满足这个条件也是一定合法的。统计一下即可。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 1010 int n,cnt[40]; int main() { freopen("subset.in","r",stdin); freopen("subset.out","w",stdout); while (scanf("%d",&n)>0) { memset(cnt,0,sizeof(cnt)); for (int i=1;i<=n;i++) { int x=read(); for (int j=30;~j;j--) if (x&(1<<j)) {cnt[j]++;break;} } for (int i=1;i<31;i++) cnt[0]=max(cnt[0],cnt[i]); printf("%d\n",cnt[0]); } return 0; }