问题7:圣诞节的游戏(异或和最小

文章讨论了在信奥课程中,给定一组非负整数,如何通过异或操作将它们分到不同的组,使得所有组的异或和之和最小。提供了C语言代码示例和样例输入输出解析。
摘要由CSDN通过智能技术生成

本学期信奥课程即将结束了。叶老师准备了n个卡片,每个卡片上有一个非负整数。在游戏前,叶老师把卡片分给了大家,每人一张。游戏内容就是大家分成若干组,多少组,每组如何分你们可以根据卡片上的数字决定,但希望
(1)n个数中的每一个数都恰好被分到了一个组中,且每一组至少包含一个数。
  (2) 定义一组数的权值为该组内所有数的异或和。希望所有组数的权值之和最小。
聪明的你能快速找到如何分组,满足要求吗?

输入

输入的第一行包含一个正整数n ,表示给定的非负整数的数量。

接下来一行包含n个非负整数a1,a2,...,an。

输出

输出一行一个整数表示答案。

样例输入 Copy
【样例输入1】
3
1 2 5
【样例输入2】
6
9 18 36 25 9 32
样例输出 Copy
【样例输出1】
6
【样例输出2】
15
提示

2个数异或,就是2个数都用二进制表示,然后对应位相同(都为0,或都为1)则该为异或后是0,对应位不同(一个是0,一个是1)则异或后该为为1,见下图
3和5异或C语言里写成3^5,多个数异或又称为异或和


 



【样例1解释】

一种最优的分组方案如下:

  • 将第1个数和第3个数分为一组,该组的权值为 1^5=4
  • 将第2个数分为一组,该组的权值为2 

该分组方案的所有组的权值之和为4+2=6 ,可以证明,不存在权值之和更小的分组方案。

【样例2解释】

一种最优的分组方案如下:

  • 将第1个数和第5个数分为一组,该组的权值为 9^9=0
  • 将第2个数和第4个数分为一组,该组的权值为 18^25=11
  • 将第3个数和第6个数分为一组,该组的权值为 36^32=4

该分组方案的所有组的权值之和为0+11+4=15 。可以证明,不存在权值之和更小的分组方案。
80%  n<=15

100% n<=10^6,ai<=10^9

#include<stdio.h>
int main()
{
	int n,i,he;
	scanf("%d",&n);
	int a[n];
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<n;i++)
	{
		he^=a[i];
	}
	printf("%d",he);
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值