华为OD机试真题 - 信道分配 (D卷,200分)

题目描述

算法工程师小明面对着这样一个问题 ,需要将通信用的信道分配给尽量多的用户:

信道的条件及分配规则如下:

  1. 所有信道都有属性:”阶”。阶为 r的信道的容量为 2^r比特;
  2. 所有用户需要传输的数据量都一样:D比特;
  3. 一个用户可以分配多个信道,但每个信道只能分配给一个用户;
  4. 只有当分配给一个用户的所有信道的容量和>=D,用户才能传输数据;

给出一组信道资源,最多可以为多少用户传输数据?

目录

题目描述

输入描述

输出描述

用例

题目解析

Java算法源码

JS算法源码

Python算法源码

C算法源码

华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100分,第三道为中等或困难题,分值为200分。总分为400分,150分钟,机试是在牛客考试,练习的时候也可以在牛客网练习,提前熟悉操作

https://ac.nowcoder.com/acm/contest/5652/K

点击上方链接进入牛客练习界面,可以自定义题目,自定义输入、输出等等,华为OD真实机试环境,非其他第三方平台模拟。

输入描述

第一行,一个数字 R。R为最大阶数。

0<=R<20

第二行,R+1个数字,用空格隔开。代表每种信道的数量 Ni。按照阶的值从小到大排列。

0<=i<=R,0<=Ni<1000.

第三行,一个数字 D。D为单个用户需要传输的数据量。

0<D<1000000

输出描述

一个数字(代表最多可以供多少用户传输数据)

用例

题目解析

  1. 首先将输入的信道资源和用户需要传输的数据量转换为相应的变量。
  2. 初始化一个变量max_users用于记录最多可以供多少用户传输数据。
  3. 遍历所有可能的用户分配信道的情况,对于每个用户分配信道的组合,计算该组合的总容量是否大于等于D,如果是,则更新max_users的值。
  4. 最后输出max_users作为结果。

Python算法源码

 
 R = int(input())
N = list(map(int, input().split()))
D = int(input())


def calc_sub(bin1):
    ans = 0
    for i in range(len(bin1)):
        ans += bin1[i] * (1 << i)
    return ans


def binary_sub(minuend, subtrahend):
      i = len(minuend) - 1
    while i >= 0:
        if minuend[i] >= subtrahend[i]:
             minuend[i] -= subtrahend[i]
        else:
             if calc_sub(minuend[0:i + 1]) < calc_sub(subtrahend[0:i + 1]):
                 j = i + 1
                while j < len(minuend):
                    if minuend[j] > 0:
                         minuend[j] -= 1
                        return True
                    else:
                         j += 1
                 return False
            else:
                 minuend[i] -= subtrahend[i]

                 minuend[i - 1] += minuend[i] << 1

                 minuend[i] = 0

        i -= 1

    return True


 def getResult():
     subtrahend = list(map(int, str(bin(D))[2:]))
    subtrahend.reverse()

     count = 0

     for i in range(len(subtrahend), R + 1):
         count += N[i]

     minuend = N[0:len(subtrahend)]
    while len(minuend) < len(subtrahend):
        minuend.append(0)

 
    while binary_sub(minuend, subtrahend):
        count += 1

    return count


 
print(getResult())


Java算法源码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int R = sc.nextInt();

    int[] N = new int[R + 1];
    for (int i = 0; i <= R; i++) {
      N[i] = sc.nextInt();
    }

    int D = sc.nextInt();

    System.out.println(getResult(R, N, D));
  }

  public static int getResult(int R, int[] N, int D) {
 
    int[] subtrahend =
        Arrays.stream(new StringBuilder(Integer.toBinaryString(D)).reverse().toString().split(""))
            .mapToInt(Integer::parseInt)
            .toArray();

    
    int count = 0;

   
    for (int i = R; i >= subtrahend.length; i--) {
      
      count += N[i];
    }

  
    int[] minuend = Arrays.copyOfRange(N, 0, subtrahend.length);

  
    while (binary_sub(minuend, subtrahend)) {
      count++;
    }

    return count;
  }

 
  public static boolean binary_sub(int[] minuend, int[] subtrahend) {
   
    for (int i = minuend.length - 1; i >= 0; i--) {

      if (minuend[i] >= subtrahend[i]) {

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024华为OD机试题库D卷 文章被收录于专栏

2024年5-11月份考的D卷,不用再看AB卷,CD卷题目一样。多种语言解法,欢迎提供更好的解法。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务