【华为OD】C卷真题:200分 信道分配 Java代码实现[思路+代码]

 C++代码实现:

【华为OD】C卷真题:200分 信道分配 C/C++代码实现[思路+代码]-CSDN博客

C语言代码实现:

【华为OD】C卷真题:200分 信道分配 C语言代码实现[思路+代码]-CSDN博客

题目描述:

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

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

1)     所有信道都有属性:”阶”。阶为r的信道的容量为2^r比特;

2)     所有用户需要传输的数据量都一样:D比特;

3)     一个用户可以分配多个信道,但每个信道只能分配给一个用户;

4)     只有当分配给一个用户的所有信道的容量和>=D,用户才能传输数据;

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

输入描述:

 
  

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

0<=R<20

第二行,R+1个数字,用空格隔开。

代表每种信道的数量Ni。按照阶的值从小到大排列。

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

第三行,一个数字D。

D为单个用户需要传输的数据量。

0

输出描述:

 
  

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

示例1输入输出示例仅供调试,后台判题数据一般不包含示例

输入

5
10 5 0 1 3 2
30

输出

4

说明

 
  

最大阶数为5.

信道阶数:0       1    2    3    4    5

信道容量:1       2    4    8    16  32  

信道个数:10     5    0    1    3    2

单个用户需要传输的数据量为30

可能存在很多分配方式,举例说明:

分配方式1:

1)     32*1 = 32

2)     32*1 = 32

3)     16*2 = 32

4)     16*1 + 8*1 + 2*3 = 30

剩下2*2 + 1*10=14不足以再分一个用户了。

分配方式2:

1)     16*1 + 8*1 + 2*3 = 30

2)     16*1 + 2*2 + 1*10 = 30

3)     32*1 = 32

4)     32*1 = 32

剩下16*1=16不足以再分一个用户了。

分配方式3:

1)     16*1 + 8*1 + 2*3 = 30

2)     16*1 + 2*2 + 1*10 = 30

3)     16*1 + 32*1 = 48

4)     32*1 = 32

恰好用完。

虽然每种分配方式剩下的容量不同,但服务的用户数量是一致的。因为这个问题中我们只关心服务的用户数,所以我们认为这些分配方式等效。

     668                                                         
                                                            
              +---+                                                          
  3            |   |       ++                               +       +---|   
  |           |   | 3      +                6               +  |   +   |        +
  |      +     |   |       +         +                      +    |  +   |       +
  |      +    |   +---+    +        +        +++++          +   |  +   |        +
  |      +    | +      |   +   +----+        |   |          +   |  +   |        +
  |      +  3 | +      |   +   +    +      2 |   |     2    +   |  +   |        +
  |      +    | +      |   +   +    +        |   |          +   |  +   |        +
  |      +---+ |     |    |  |    +    ----+   |   +---+    |  |  +   |         +
  |      |     |     |    |  |    +    |       |   |   |    |  |  +   |         +
  |    1 |     |     | 8  |  |    +  1 |   |    | 1 |   | 1 |   |  +   |        +
  |      |     |     |    |  |    +    |   |    |   |   |   |   |  +   |        +
  |  +---+     |     +---+   |    ++---+    ++   +---+   +---+   |  +   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  |0 |         |         | 0 |  0 |         ++              | 0 |  |+   |        +
  |  |         |         |   |    |         ++              |   |  |+   |        +
  +---+         +          +-------+                       +---+| +|+   |        +
                +                                                    +   |        +
    0   1   2   3   4   5   6   7   8   9  10  11  12 + v:    w  u m    u 1 0 2 4
 

题目解析:

        按题目逻辑来解即可

代码实现:

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Main {
    public static int calc(List channel, int D) {
        int total = 0;
        while (true) {
            int val = 0;
            boolean flag = false;
            for (int i = channel.size() - 1; i >= 0; --i) {
                while (channel.get(i) > 0) {
                    val += (int) Math.pow(2, i);
                    channel.set(i, channel.get(i) - 1);
                    if (val >= D) {
                        flag = true;
                        ++total;
                        break;
                    }
                }
                if (flag) {
                    break;
                }
            }
            if (!flag) {
                return total;
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.nextLine();
        List channel = Arrays.stream(scanner.nextLine().split(" "))
                .map(Integer::parseInt).collect(Collectors.toList());
        int D = Integer.parseInt(scanner.nextLine());
        System.out.println(calc(channel, D));
    }
}

 

你可能感兴趣的:(杂谈,算法,华为od,java,python,c语言,开发语言,码蚁软件)