目录
题目
思路
核心考点
Code
题目
【分苹果】
A、B两个人把苹果分为两堆,A希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算进位 12+5=9(1100 + 0101 = 9),B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多。
输入苹果的数量和每个苹果重量,输出满足A的情况下B获取的苹果总重量。
如果无法满足A的要求,输出-1。
数据范围
1 <= 总苹果数量 <= 20000
1 <= 每个苹果重量 <= 10000
输入描述:
输入第一行是苹果数量:3
输入第二行是每个苹果重量:3 5 6
输出描述:
输出第一行是B获取的苹果总重量:11
示例1?输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3
3 5 6
输出
11
示例2?输入输出示例仅供调试,后台判题数据一般不包含示例
输入
8
7258 6579 2602 6716 3050 3564 5396 1773
输出
35165
思路
1:先审题,A的目标是 等分,也就是目标是一人一半。
2:不进位的二进制加法,等同于二进制的异或操作。
3:B要先满足 A 的 需求,那么肯定要先判定所有苹果在不进位的二进制加法前提下能否等分,等分那就意味着分出来的两堆苹果异或的结果为 0。
4:如果可以等分,那么取出最小的苹果分给 A 即可。因为所有苹果异或的结果是0,所以任意拿出1个,分成另一堆, 那么这两堆的重量,按照A的算法去算,必然是相等的 (不信可以试一试)。
5:如果不能等分,则直接返回 -1。
核心考点
1:题目理解能力
2:异或的应用
Code
// Online C++ compiler to run C++ program online
#include<iostream>
#include<vector>
using namespace std;
int main() {
//苹果个数
int num;
cin >> num;
//苹果重量
vector<int> weight_array;
while (num) {
num--;
int weight;
cin >> weight;
weight_array.push_back(weight);
}
// 因为max_weight < 10000
int min_weight = 10001;
int a_weight = 0, b_weight = 0;
for (auto x : weight_array) {
//求和、求异或,最小苹果的重量
a_weight ^= x;
b_weight += x;
min_weight = min(min_weight, x);
}
// 如果异或结果是0,则有解
if (a_weight == 0) {
cout << b_weight - min_weight << endl;
}
else {
cout << -1 << endl;
}
return 0;
}
|