[模拟赛]异或最大值 maxinum
此题在考试时用暴力,暴了30分。
献上30分代码:
- #include<stdio.h>
- int a[];
- int main()
- {
- int n,t,c,i,max,j,d;
- freopen("maximum.in","r",stdin);
- freopen("maximum.out","w",stdout);
- scanf("%d",&t);
- while(t--)
- {
- max=;
- scanf("%d%d",&n,&c);
- for(i=;i<=n;i++)
- scanf("%d",&a[i]);
- if(c==)
- {
- for(i=;i<=n;i++)
- for(j=i+;j<=n;j++)
- {
- d=a[i]&a[j];
- if(d>=max)max=d;
- }
- }
- if(c==)
- {
- for(i=;i<=n;i++)
- for(j=i+;j<=n;j++)
- {
- d=a[i]^a[j];
- if(d>=max)max=d;
- }
- }
- if(c==)
- {
- for(i=;i<=n;i++)
- for(j=i+;j<=n;j++)
- {
- d=a[i]|a[j];
- if(d>=max)max=d;
- }
- }
- printf("%d\n",max);
- }
- fclose(stdin);
- fclose(stdout);
- return ;
- }
注意与运算符(&),或运算符(|),异或运算符(^)
详细解说:http://www.cnblogs.com/wisdom-jie/p/7732940.html
正解:
1、0-1字典树:
这里其实是就是二叉树,之所以叫做字典树是因为我们的算法把一个数当成了一个31位的字符串来看,比如1就是三十个零外加一个一,这一部分还是比较简单的。
2、贪心找最大异或值:
异或运算有一个性质,就是对应位不一样为1,我们要让结果最大化,就要让越高的位置为1。我们找跟一个数的异或结果最大的数,就从树的根结点(最高位)开始找,如果对应位置这个数是0,优先去找那一位为1的数,找不到才去找0;如果对应位置这个数是1,优先去找那一位为0的数,找不到才去找0;最终找到的数就是跟这个数异或结果最大的数。n个数,每个数找一个这样的数并算出结果求其中的最大值,可以得到答案。
参考代码如下:
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- int n,a[],tmp[];
- struct node
- {
- int val;
- node *left, *right;
- node(int value=-)
- {
- val = value;
- left = right = NULL;
- }
- };
- node *head = NULL;
- void cal(int num)
- {
- memset(tmp,,sizeof(tmp));
- int cnt=;
- while(num)
- {
- tmp[cnt++]=num%;
- num/=;
- }
- for(int i=;i<;i++)
- swap(tmp[i],tmp[-i]);
- }
- void insert(node* &head, int index, int &num)
- {
- if(index+==)
- {
- head->val = num;
- return;
- }
- if(tmp[index+]== && !head->left)
- head->left = new node(-);
- if(tmp[index+]== && !head->right)
- head->right = new node(-);
- if(tmp[index+]==)
- insert(head->left,index+,num);
- if(tmp[index+]==)
- insert(head->right,index+,num);
- }
- int dfs(node* &head,int index)
- {
- if(index+==)
- return head->val;
- if(tmp[index+]==)
- {
- if(head->right)
- {
- return dfs(head->right,index+);
- }
- else
- {
- return dfs(head->left,index+);
- }
- }
- else
- {
- if(head->left)
- {
- return dfs(head->left,index+);
- }
- else
- {
- return dfs(head->right,index+);
- }
- }
- }
- int main()
- {
- while(scanf("%d",&n))
- {
- for(int i=;i<n;i++)
- scanf("%d",&a[i]);
- head = new node(-);
- for(int i=;i<n;i++)
- {
- cal(a[i]);
- insert(head,-,a[i]);
- }
- int ans=;
- for(int i=;i<n;i++)
- {
- cal(a[i]);
- ans = max(ans, a[i]^dfs(head,-));
- }
- printf("%d\n",ans);
- }
- return ;
- }
[模拟赛]异或最大值 maxinum的更多相关文章
- 2013级新生程序设计基础竞赛-正式赛 F 异或最大值 解题报告
F - 异或最大值 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Subm ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- BZOJ2741: 【FOTILE模拟赛】L
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1170 Solved: 303[Submit][Status] ...
- NOIP模拟赛 17.10.10
初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1116 Solved: 292[Submit][Status] ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
随机推荐
- uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1
Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General ...
- 【后台测试】postman简介
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/6266047.html 在接口测试的过程中,经常拿到一个接口 ...
- Git远程操作详解(新手必备)
Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...
- Redis数据结构:链表
链表被广泛用于Redis的各种功能,比如列表键.发布与订阅.慢查询.监视器等. 每个链表节点由一个listNode结构表示,每个节点都有前置节点和后置节点. 每个链表使用一个list结构来表示,这个结 ...
- 老鼠走迷宫(2)输出所有路径(C语言)
需求 有一个迷宫,在迷宫的某个出口放着一块奶酪.将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪.请找出它的行走路径. STEP 1 题目转化 我们用一个二维数组来表示迷宫,用2表示迷宫的墙壁, ...
- APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号
如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_ ...
- Linux驱动入门——构建和运行模块
Hello world模块 本文介绍如何向内核中添加一个hello模块.该模块的功能是在模块加载时,向系统日志输出"hello world\n" 在模块卸载时输出"Goo ...
- [置顶]
JVM层对jar包字节码加密
github https://github.com/sea-boat/ByteCodeEncrypt 需求 拿到的需求是要对某特定的jar包实现加密保护,jar包需要提供给外部使用,但核心逻辑部分需要 ...
- EasyPlayer RTSP Windows(with ActiveX/OCX插件)播放器支持H.265播放与抓图功能
EasyPlayer作为业界一款比较优秀的RTSP播放器,一直深受用户的好评,经过了近3年的开发和迭代,从一开始的简单PC版本的RTSP播放功能,到如今支持PC(支持ocx插件).Android.iO ...
- angularjs 阻止浏览器自带的回退
$scope.$on('$locationChangeStart', function(e) { if(!tfOrder && comm.getStorage('orederlistL ...