#C0E92. 华为OD机试E卷 - 分奖金

华为OD机试E卷 - 分奖金

华为OD机试E卷 - 分奖金(Java & Python& JS & C++ & C )

https://blog.csdn.net/banxia_frontend/article/details/129470805

最新华为OD机试

真题目录:点击查看目录 华为OD面试真题精选:点击立即查看

题目描述

公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。

按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么,前面的员工就可以获得“距离*数字差值”的奖金。如果遇不到比自己数字大的,就给自己分配随机数数量的奖金。

例如,按照工号顺序的随机数字是:2,10,3。那么第2个员工的数字10比第1个员工的数字2大,所以,第1个员工可以获得1*(10-2)=8。第2个员工后面没有比他数字更大的员工,所以,他获得他分配的随机数数量的奖金,就是10。第3个员工是最后一个员工,后面也没有比他更大数字的员工,所以他得到的奖金是3。

请帮老板计算一下每位员工最终分到的奖金都是多少钱。

输入描述

第一行n表示员工数量(包含最后一个老板) 第二是每位员工分配的随机数字

输出描述

最终每位员工分到的奖金数量

注:随机数字不重复,员工数量(包含老板)范围1~10000,随机数范围1~100000

示例1

输入

3
2 10 3

输出

8 10 3

说明

Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);  
        int employeeNum = scanner.nextInt(); // 读取员工数量
        int[] randomNumbers = new int[employeeNum]; // 创建数组存储随机数字
        int[] bonuses = new int[employeeNum]; // 创建数组存储奖金

        // 读取随机数字
        for (int i = 0; i < employeeNum; i++) {
            randomNumbers[i] = scanner.nextInt(); // 将输入的随机数字存入数组
        }

        // 计算每个员工的奖金
        for (int i = 0; i < employeeNum; i++) {
            int j = i + 1; // 初始化 j 为 i 的下一个位置
            // 查找第一个比当前随机数字大的数字
            while (j < employeeNum && randomNumbers[j] <= randomNumbers[i]) {
                j++; // 向后查找
            }
            // 计算奖金
            bonuses[i] = j < employeeNum ? (j - i) * (randomNumbers[j] - randomNumbers[i]) : randomNumbers[i];
        }

        // 输出所有奖金
        for (int i = 0; i < employeeNum; i++) {
            System.out.print(bonuses[i] + (i < employeeNum - 1 ? " " : "\n")); // 打印奖金,格式化输出
        }
    }
}

Python

def main():
    employee_num = int(input())   
    random_numbers = list(map(int, input().split()))  # 读取随机数字并转换为整数列表
    bonuses = [0] * employee_num  # 初始化奖金数组

    # 计算每个员工的奖金
    for i in range(employee_num):
        j = i + 1  # 初始化 j 为 i 的下一个位置
        # 查找第一个比当前随机数字大的数字
        while j < employee_num and random_numbers[j] <= random_numbers[i]:
            j += 1  # 向后查找
        # 计算奖金
        bonuses[i] = (j - i) * (random_numbers[j] - random_numbers[i]) if j < employee_num else random_numbers[i]

    # 输出所有奖金
    print(" ".join(map(str, bonuses)))  # 格式化输出奖金

if __name__ == "__main__":
    main()  # 调用主函数

JavaScript

const readline = require('readline');  
const rl = readline.createInterface({
  input: process.stdin,  
  output: process.stdout,  
});

const inputLines = []; // 存储输入的行

rl.on('line', (line) => {
  inputLines.push(line); // 收集输入行

  if (inputLines.length === 2) { // 当收集到两行输入时
    const employeeNum = parseInt(inputLines[0], 10); // 解析员工数量
    const randomNumbers = inputLines[1].split(' ').map(Number); // 解析随机数字
    const bonuses = new Array(employeeNum); // 初始化奖金数组

    // 计算每个员工的奖金
    for (let i = 0; i < employeeNum; i++) {
      let j = i + 1; // 初始化 j 为 i 的下一个位置
      // 查找第一个比当前随机数字大的数字
      while (j < employeeNum && randomNumbers[j] <= randomNumbers[i]) {
        j++; // 向后查找
      }
      // 计算奖金
      bonuses[i] = j < employeeNum ? (j - i) * (randomNumbers[j] - randomNumbers[i]) : randomNumbers[i];
    }

    console.log(bonuses.join(' ')); // 输出所有奖金
    rl.close(); // 关闭输入接口
  }
});

C++

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int employeeNum; // 声明员工数量变量
    cin >> employeeNum; // 读取员工数量

    vector<int> randomNumbers(employeeNum); // 创建随机数字数组
    vector<int> bonuses(employeeNum); // 创建奖金数组

    // 读取随机数字
    for (int i = 0; i < employeeNum; i++) {
        cin >> randomNumbers[i]; // 将输入的随机数字存入数组
    }

    // 计算每个员工的奖金
    for (int i = 0; i < employeeNum; i++) {
        int j = i + 1; // 初始化 j 为 i 的下一个位置
        // 查找第一个比当前随机数字大的数字
        while (j < employeeNum && randomNumbers[j] <= randomNumbers[i]) {
            j++; // 向后查找
        }
        // 计算奖金
        bonuses[i] = j < employeeNum ? (j - i) * (randomNumbers[j] - randomNumbers[i]) : randomNumbers[i];
    }

    // 输出所有奖金
    for (int i = 0; i < employeeNum; i++) {
        cout << bonuses[i] << (i < employeeNum - 1 ? " " : "\n"); // 打印奖金,格式化输出
    }

    return 0; // 返回 0 表示程序正常结束
}

C语言

#include <stdio.h>
#include <stdlib.h>

int main() {
    int employeeNum; // 声明员工数量变量
    scanf("%d", &employeeNum); // 读取员工数量

    int *randomNumbers = (int *)malloc(employeeNum * sizeof(int)); // 动态分配随机数字数组
    int *bonuses = (int *)malloc(employeeNum * sizeof(int)); // 动态分配奖金数组

    // 读取随机数字
    for (int i = 0; i < employeeNum; i++) {
        scanf("%d", &randomNumbers[i]); // 将输入的随机数字存入数组
    }

    // 计算每个员工的奖金
    for (int i = 0; i < employeeNum; i++) {
        int j = i + 1; // 初始化 j 为 i 的下一个位置
        // 查找第一个比当前随机数字大的数字
        while (j < employeeNum && randomNumbers[j] <= randomNumbers[i]) {
            j++; // 向后查找
        }
        // 计算奖金
        bonuses[i] = (j < employeeNum) ? (j - i) * (randomNumbers[j] - randomNumbers[i]) : randomNumbers[i];
    }

    // 输出所有奖金
    for (int i = 0; i < employeeNum; i++) {
        printf("%d%s", bonuses[i], (i < employeeNum - 1) ? " " : "\n"); // 打印奖金,格式化输出
    }

    free(randomNumbers); // 释放动态分配的内存
    free(bonuses); // 释放动态分配的内存

    return 0; // 返回 0 表示程序正常结束
}

fengmian

完整用例

用例1

3
2 10 3

用例2

5
1 3 2 4 5

用例3

4
4 2 6 1

用例4

6
10 3 5 7 2 12

用例5

7
7 1 6 3 5 2 8

用例6

4
8 12 10 15

用例7

5
5 4 3 2 1

用例8

6
20 15 25 10 30 5

用例9

5
3 7 1 9 5

用例10

4
11 22 33 44