(codeforce1285D)Dr. Evil Underscores(tire树+贪心)

该博客介绍了一道关于寻找异或值最大值最小数的算法题。作者通过深度优先搜索(DFS)策略,结合贪心思想,在构建 Trie 树的基础上,动态构造目标数,以达到异或最大值最小的目标。代码中详细解释了每一步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:Problem - 1285D - Codeforces

题目大意:就是说给你一些数x1,x2,……xn,让你找到一个数y使得y与x1,x2,……xn中任何一个数的异或值的最大值最小。

这道题目呢,我是用dfs做的,容易想到的是我们先要把这些数加入tire树中,但这与之前那个最大异或对的题目有很大不同,在那道题目中我们是要用一个确定的数去寻找最大异或值,而这道题目没有给出具体的值。但是我们可以利用贪心的思想来构造出一个数使得他满足题意,我们还是按照构建tire树的方法来遍历,只是在遍历过程中有选择性地确定搜索的方向,代码中有详细解释,下面给出代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=4e6+10;
int son[N][2],idx;
//建立tire树 
void insert(int x)
{
	int p=0;
	for(int i=31;i>=0;i--)
	{
		int u=x>>i&1;
		if(!son[p][u]) son[p][u]=++idx;
		p=son[p][u];
	}
}
//搜索构造异或最大值的最小值
int dfs(int p,int pos)
{
	int ans=0;//最大异或值的最小值
	if(son[p][0]&&son[p][1])//当前情况说明,无论y的第32-pos位是0还是1,异或以后这一位都会出现1 
		{
			ans+=1<<(31-pos);//因为异或以后这一位一定是1,所以计入答案
			ans+=min(dfs(son[p][0],pos+1),dfs(son[p][1],pos+1));//递归找出之后位所形成的最小值 
		}
	else if(son[p][0])//如果当前位置就只有0,我们可以取y的当前位为1,再递归找出之后位所形成的最小值 
		ans+=dfs(son[p][0],pos+1);
	else if(son[p][1])//如果当前位置就只有1,我们可以取y的当前位为0,再递归找出之后位所形成的最小值
		ans+=dfs(son[p][1],pos+1);
	return ans;
}
int main()
{
	int n,t;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t);
		insert(t);
	}
	printf("%d",dfs(0,0));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值