华为机试:分糖问题

题目来源

题目描述

在这里插入图片描述
在这里插入图片描述

题目解析

分析:

  • k的加法不进位,就是在做异或运算
  • k不哭的前提是:k和s两方拥有相同重量的糖,也就是说,分成两堆数各自进行异或运算,运算到最后,剩下两个相等的数,那么对于相同的两个数,再做一次异或运算呢?没错,结果是0
  • 因此,对于判断是否能够成功分糖,可以将所有的数执行一次异或运算,判断最终结果是否为0即可
  • 还有一个问题是S要拿最多的糖?很简单,只需要让k拿最少的糖就行,在分糖成功的情况下,只需要将所有糖ongoDB重量最小的糖分给k即可,因为剩下的糖的总重量经过异或,最终一定会等于k拿到的糖果的重量,因此只需要找出所有数中最小的数和所有数之和即可,最终S分得的糖的重量就等于减去的最小值

所以这道题要解决两个问题:

  • 能不能让K不哭
  • 怎么才能得到最多的糖

好屑的哥哥

#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <random>
#include <ctime>
#include <iterator>

using namespace std;

class Solution{
public:
    // (2 ≤ N ≤ 15)
    int getCandy(std::vector<int> weight){
        int xorSum = weight[0], realSum = weight[0], minWeight = weight[0];
        for (int i = 1; i < weight.size(); ++i) {
            xorSum ^= weight[i];
            realSum += weight[i];
            minWeight = std::min(minWeight, weight[i]);
        }

        if(xorSum != 0){
            return -1;
        }
        return realSum - minWeight;
    }
};



int main(){
    int N = 0;
    std::cin >> N;

    std::vector<int> weight (N, 0);
    for (int i = 0; i < N; ++i) {
        std::cin >> weight[i];
    }

    Solution a;
    auto w =  a.getCandy(weight);
    std::cout << (w == -1 ? "NO" : to_string(w));
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值