noip模拟“与”
2015-09-23 22:36
127 查看
“与”
题目来源:hzwer黄学长
给你一个长度为n的序列A,请你求出一对Ai,Aj(1<=i < j< = n )使Ai“与”Aj最大。
20%的数据保证n<=5000
100%的数据保证 n<=3*10^5,0<=Ai<=10^9
思路:
因为n很大,暴力的话20分可以做到。
于是想要考虑位运算的方法。从最高位开始枚举,对于第i位,记录a[j]&(1<< i)的个数,如果大于2,就更新a数组,将在第i位没有的数删去,因为是从高位到低位枚举,所以可以保证留下的数“与”最大。
贴代码:
题目来源:hzwer黄学长
给你一个长度为n的序列A,请你求出一对Ai,Aj(1<=i < j< = n )使Ai“与”Aj最大。
20%的数据保证n<=5000
100%的数据保证 n<=3*10^5,0<=Ai<=10^9
思路:
因为n很大,暴力的话20分可以做到。
于是想要考虑位运算的方法。从最高位开始枚举,对于第i位,记录a[j]&(1<< i)的个数,如果大于2,就更新a数组,将在第i位没有的数删去,因为是从高位到低位枚举,所以可以保证留下的数“与”最大。
贴代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<cmath> #include<algorithm> using namespace std; int n,a[300002],d[35],ans; void init() { scanf("%d",&n); int i; for(i=1;i<=n;i++) scanf("%d",&a[i]); } void find() { int i,j,ct,now=n,t; for(i=30;i>=0;i--) {ct=0; for(j=1;j<=now;j++) {if(a[j]&(1<<i)) ct++;} if(ct<2) continue; t=0; d[i]=1; for(j=1;j<=now;j++) {if(a[j]&(1<<i)) a[++t]=a[j];} now=t; } for(i=30;i>=0;i--) {if(d[i]) ans=ans^(1<<i); } printf("%d\n",ans); } int main() { init(); find(); return 0; }
相关文章推荐
- linux下C++ gdb调试笔记
- Android Studio 简单设置界面设置
- html5基础
- WCF基础之事务
- 杭电4551生日猜猜猜
- 黑马程序员————JAVA语言基础
- iOS巅峰之UI视图动画详解
- URI和URL的区别
- 数据库之数据的插入与显示之二
- NYOJ 218 Dinner (字符串&贪心)
- sqlalchemy db test
- 机器学习 之 牛顿法和梯度下降法原理与实现
- uva 1411 - Ants(几何+完美匹配)
- java面试题八 传值传引用
- 第二讲
- fpga设计思想(一):三种建模方式
- 第105讲:解析Akka中的子Actor及其代码学习笔记
- 【ROS学习记录——1】ROS学习资料记录
- html5基础
- JavaEE系列之(三)JDBC操作MySQL数据库