常用的运算符共 6 种,分别为 与( & )、或( | )、异或( ^ )、取反( ~ )、左移( << )和右移( >> )。 转载自oi_wiki
对 2 的非负整数次幂取模
int modPowerOfTwo(int x, int mod) { return x & (mod - 1); }一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。比如集合 {1, 3, 4, 8} ,可以表示成
而对应的位运算也就可以看作是对集合进行的操作。
题目背景 在这世上有一乡一林一竹亭,也有一主一仆一仇敌。
有人曾经想拍下他们的身影,却被可爱的兔子迷惑了心神。
那些迷途中的人啊,终究会消失在不灭的永夜中……
题目描述 蓬莱山 辉夜(Kaguya)手里有一堆数字。
辉夜手里有 n 个非负整数 ,由于辉夜去打 Gal Game 去了,她希望智慧的你来帮忙。
你需要将这些数分成若干组,满足 nn 个数中的每一个数都恰好被分到了一个组中,且每一组至少包含一个数。 定义一组数的权值为该组内所有数的异或和。请求出一种分组方案,使得分出的所有组数的权值之和最小,输出权值之和的最小值。
输入格式 输入的第一行包含一个正整数 n,表示给定的非负整数的数量。
接下来一行包含 n 个非负整数
输出格式 输出一行一个整数表示答案。
输入输出样例 输入 #1
3 1 2 5输出 #1
6输入 #2
6 9 18 36 25 9 32输出 #2
15思路:易得a^b<=a+b 异或实际上就是不进位的加法 本题要求分组并把这些数加起来,使得总和最小
分组越少,异或越多,总和也就越小,所以只要分1组就可以
#include<iostream> using namespace std; int n,t,ans; int main() { cin>>n; while(n--) { cin>>t; ans^=t; } cout<<ans; return 0; }