题目链接
https://www.luogu.org/problemnew/show/CF336C
分析
一个比较妙的贪心
我们要让最后$and$起来的数被$2^k$整除且$k$最大,我们不妨从后往前枚举$k$,同时运用贪心的思路,对于二进制第$k$为1的数,我们想让最后得到的数除第$k$位外都为0,当然是$and$越多越好
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cctype> #include <queue> #include <bitset> #define ll long long #define ri register int using std::min; using std::max; template <class T>inline void read(T &x){ x=0;int ne=0;char c; while(!isdigit(c=getchar()))ne=c=='-'; x=c-48; while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48; x=ne?-x:x;return ; } const int maxn=100005; const int inf=0x7fffffff; int a[maxn],n,q[maxn]; int main(){ int x,y,z; int ans=0; read(n); for(ri i=1;i<=n;i++){ read(a[i]); } for(ri k=30;k>=0;k--){ x=(1<<k); y=x-1; ans=0; for(ri i=1;i<=n;i++){ if(a[i]&x){ y=y&a[i]; q[++ans]=a[i]; } } if(y==0){ printf("%d\n",ans); for(ri i=1;i<=ans;i++){ printf("%d ",q[i]); } puts(""); return 0; } } return 0; }
|