华为机考真题 -- 剩余银饰的重量

题目描述:

有 N 块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。

每一回合,从中选出三块最重的银饰,然后一起熔掉。假设银饰的重量分别为 x 、y 和 z,且 x <= y <= z。那么熔掉的可能结果如下:
1. 如果 x == y == z,那么三块银饰都会被完全熔掉;
2. 如果 x == y 且 y != z,会剩余重量为 z - y 的银块无法被熔掉;
3. 如果 x != y 且 y == z,会剩余重量为 y - x 的银块无法被熔掉;
4. 如果 x != y 且 y != z,会剩余重量为 z - y 与 y - x 差值的银块无法被熔掉。
5. 最后,如果剩余两块,返回较大的重量(若两块重量相同,返回任意一块皆可);如果只剩
下一块,返回该块的重量;如果没有剩下,就返回 0。

输入描述:

输入数据为两行;
第一行为银饰数组长度 n,1 ≤ n ≤ 40;
第二行为 n 块银饰的重量,重量的取值范围为[1,2000],重量之间使用空格隔开;

输出描述:

如果剩余两块,返回较大的重量(若两块重量相同,返回任意一块皆可);如果只剩下一块,返回该块的重量;如果没有剩下,就返回 0。

示例1:

输入
3
1 1 1

输出
0
说明:选出 1 1 1,得到 0,最终数组转换为 [],最后没有剩下银块,返回 0

示例2:

输入
3
3 7 10

输出
1

说明:选出 3 7 10,需要计算 (7-3) 和 (10-7) 的差值,即(7-3)-(10-7)=1,所以数组转换为 [1],剩余一块,返回该块重量,返回 1

C++源码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
//#include <math>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> weights(n);
    for (int i = 0; i < n; ++i) {
        cin >> weights[i];
        if (cin.get() == '\n') {
            break;
        }
    }

    sort(weights.begin(), weights.end());

    while (weights.size() >=3)
    {
        int x = 0;
        int y = 0;
        int z = 0;
        int len = weights.size();

        cout << "len=" << len << endl;
        z = weights[len - 1];
        y = weights[len - 2];
        x = weights[len - 3];

        if ((x == y) && (y == z)) {
            weights.pop_back();
            weights.pop_back();
            weights.pop_back();
        }
        else if ((x == y) && (y != z)) {
            int temp1 = z - y;
            weights.pop_back();
            weights.pop_back();
            weights.pop_back();
            weights.push_back(temp1);
        }
        else if ((y == z) && (x != y)) {
            int temp2 = z - y;
            weights.pop_back();
            weights.pop_back();
            weights.pop_back();
            weights.push_back(temp2);
        }
        else if ((y != z) && (x != y)) {
            int temp3 = abs(z - y - (y - x));
            weights.pop_back();
            weights.pop_back();
            weights.pop_back();
            weights.push_back(temp3);
        }

        sort(weights.begin(), weights.end());
        
    }

    if (weights.empty()) {
        cout << 0 << endl;
    }
    else if (weights.size() == 1) {
        cout << weights[0] << endl;
    }
    else if (weights.size() == 2) {
        int maxWeights = max(weights[0], weights[1]);
        cout << maxWeights << endl;   
    }

    system("pause");
    return 0;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD机考真题是指华为公司在招聘过程中所使用的在线机考试题目。这些题目旨在评估应聘者的技术能力、逻辑思维以及解决问题的能力。以下是对华为OD机考真题解读的简要说明。 华为OD机考真题的内容丰富多样,主要涵盖计算机科学、网络技术、算法设计、数据结构等多个领域。对于应聘者来说,这些题目不仅要求具备扎实的专业知识,还要求能够将知识应用于实际场景中,并能够灵活运用、创新思考。 在解答华为OD机考真题时,应聘者需要具备良好的解题思路和方法。首先,应聘者需要仔细阅读题目,理解题意和要求,明确问题的关键点。其次,应聘者需要运用所学知识和技能分析问题,并制定解决方案。此时,良好的逻辑思维和分析能力是十分重要的。最后,应聘者需要将解决方案转化为具体的代码实现或解题步骤,并进行测试和验证。 华为OD机考真题的目的是为了筛选出具备优秀技术能力和解决问题能力的人才。在解题过程中,华为注重考察应聘者的创新能力和解决问题的能力,不仅关注结果,还关注解决问题的思路和方法。因此,应聘者在回答真题时除了要给出正确的答案,还需要展现出对问题的全面思考和独立思考的能力。 总之,华为OD机考真题的解答需要应聘者具备扎实的专业知识、良好的解题思路、逻辑思维能力和解决问题的能力。这些真题旨在筛选出具备创新思维和解决问题能力的优秀人才。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值