HDU 4825:Xor Sum(01字典树+贪心)
来源:互联网 发布:qt creator 运行c语言 编辑:程序博客网 时间:2024/06/01 10:42
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825
题目是给出N个数,然后给出M个数,给出一个数X,求N个数中谁与X异或的值
最大,构建字典树然后进行贪心,对于一个数字将其化成2进制后,不足32位,
则前面补0,把每个数字都扩充够32位,然后从高位开始到低位构建字典树,然后
给出一个数X,照样转换成2进制,如果位数不足32位,前面高位都填充上0,然后
进字典树进行求解,如果当前位为1,则需要走字典树中相同位置的0节点,如果
当前位为0,则需要走字典树中相同位置的1节点(这两个是在对应位置节点存在
的条件下进行的)。如果当前位为1,且没有对应为0的节点,则还要走1,如果
当前位为0,且没有对应为1的节点,则还要走0.
这样贪心的正确性?
由于字典树构建是从每个数的高位和低位构建的,所以当给出一个数X,要想让异或
的值最大,则当然想X化为2进制后最高位和另一个数异或值为1,然后就想次高位和
另一个数的异或值也是1,每次我们都保证尽可能高的位上异或的值是1,越高的位
对应的权重越大,则X与该数的异或的值也越大。则按照这样贪心的思想找到的那个
数字,必定是所有数字中与X异或后值最大的,这个数字就是我们要的答案。
PS:今年亚洲区域赛青岛站热身赛的第三个题目就是和这个题目相同思路的题目,
也是给出N个数字,然后M个操作,操作分为两种,一种是给出一个数,N个数都要与
这个数字异或,另一种是给出一个数,求前K大数的和,当时没有做出来,后来问了
做出的人,他们就是构建01字典树搞定的,那个题目应该就是这个题目变化过去的。
AC代码:
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;const int maxn = 2000000;int node[maxn][2];int bit[35],cnt,id; ///id用来为节点编号///每个数字从高位到低位构建字典树void buildTrie() { int p = 0; int cnt = 1; while(cnt<=32) { int num = bit[cnt]; ///如果该节点不存在,则创建该节点; if(node[p][num] == -1) { node[id][0] = node[id][1] = -1; node[p][num] = id++; } p = node[p][num]; cnt++; }}int getAns() { int p = 0; int cnt = 1; int sum = 0; while(cnt <= 32) { int number = 1-bit[cnt]; ///如果是0的话走1,否则的话走0 if(node[p][number]!=-1) { ///节点存在,就走下去 sum = sum*2 + number; p = node[p][number]; } else { ///值相反的节点不存在,还要顺着当前的数字走 sum = sum*2 + bit[cnt]; p = node[p][bit[cnt]]; } cnt++; } return sum;}int main() { int X,T,N,M,Case=0; ///T组测试数据,N个数字,M个询问 scanf("%d",&T); while(T--) { node[0][0] = -1; node[0][1] = -1; id = 1; scanf("%d%d",&N,&M); for(int i = 1; i <= N; i++) { scanf("%d",&X); memset(bit,0,sizeof(bit)); cnt = 32; while(X) { bit[cnt--] = X%2; X = X/2; } buildTrie(); } printf("Case #%d:\n",++Case); for(int i = 1; i <= M; i++) { scanf("%d",&X); memset(bit,0,sizeof(bit)); cnt = 32; while(X){ bit[cnt--] = X%2; X = X/2; } int ans = getAns(); printf("%d\n",ans); } } return 0;}
阅读全文
0 0
- HDU 4825:Xor Sum(01字典树+贪心)
- Hdu 4825 Xor Sum【字典树+贪心】
- 【01字典树】HDU 4825 Xor Sum
- HDU 4825 Xor Sum 01字典树
- HDU 4825 Xor Sum (01字典树)
- HDU 4825 Xor Sum(01字典树)
- HDU 4825 Xor Sum 【01字典树】
- hdu Xor Sum 4825 01字典树
- HDU-Xor Sum(01字典树)
- HDU 4825 Xor Sum (01字典树)
- HDU 4825 Xor Sum(经典01字典树)
- HDU 4825 Xor Sum(01字典树+异或)
- HDU 4825 Xor Sum(01字典树)
- hdu 4825 Xor Sum(01字典树)
- hdu 4825 Xor Sum(字典树)
- hdu 4825 Xor Sum(字典树)
- HDU-4825-Xor Sum【字典树】
- hdu 4825 Xor Sum(字典树)
- jdk的安装和环境变量的配置
- Visual C++ 和 C++ 有什么区别?
- 51Nod 1003 阶乘后面0的数量
- Python日志产生器
- 软件工程项目——校园二手交易市场——数据流图
- HDU 4825:Xor Sum(01字典树+贪心)
- 非常值得区块链初学者看的文章
- nodejs localhost可以起服务,ip起服务不能运行
- C++信息学奥赛一本通题库1036A*B问题
- Pandas read_csv参数
- PHP基础--错误处理
- 17.11.21,web学习第八天,还有一年,努力吧青年
- URAL1013 K-based Numbers. Version 3(矩阵快速幂+大数)
- mysql数据库连接池