返回目录
题目描述
算法工程师小明面对着这样一个问题 ,需要将通信用的信道分配给尽量多的用户:
信道的条件及分配规则如下:
- 所有信道都有属性:”阶”。阶为 r的信道的容量为 2^r比特;
- 所有用户需要传输的数据量都一样:D比特;
- 一个用户可以分配多个信道,但每个信道只能分配给一个用户;
- 只有当分配给一个用户的所有信道的容量和>=D,用户才能传输数据;
给出一组信道资源,最多可以为多少用户传输数据?
输入描述
第一行,一个数字 R。R为最大阶数。
0<=R<20
第二行,R+1个数字,用空格隔开。代表每种信道的数量 Ni。按照阶的值从小到大排列。
0<=i<=R,0<=Ni<1000.
第三行,一个数字 D。D为单个用户需要传输的数据量。
0<D<1000000
输出描述
一个数字(代表最多可以供多少用户传输数据)
示例:
输入 | 5 10 5 0 1 3 2 30 |
---|---|
输出 | 5 |
说明 | 无 |
解题思路:
题目需要我们尽可能的分配最多的用户,也就是每个用户在满足信道需求的情况下信道容量要尽可能的小。
- 将所有信道求出并放入集合中
- 先将单独容量大于所需容量的信道剔除,因为它单独就能满足用户,不能让他与其他信道相加而浪费资源。
- 取出集合中最大的信道(count),
- 用(D-count=chazhi)求出还差多少信道满足需求。
- 取出集合中与chazhi最近的信道进行相加(count),如果和满足信道需求,则重复步骤3;如不满足,则重复步骤4
- 当所有信道相加都不满足需求时,程序结束!
Python算法源码
class SomeClass:
def __init__(self):
pass
def new_function(self, x, y):
"""
这个函数执行某些操作。
:param x: 一个整数。
:param y: 另一个整数。
:return: 一些操作的结果。
"""
result = x + y
return result
def modified_logic():
"""
这个函数演示了修改后的逻辑。
"""
# 输入读取
temp_var = int(input().strip())
result_list = list(map(int, input().strip().split()))
input_temp = int(input().strip())
index = 0
total_number = 0
temp_map = {}
# 遍历结果列表以创建字典
while index < len(result_list):
temp_map[2 ** index] = result_list[index]
index = index + 1
# 计算总数
for temp_key in temp_map.keys():
if temp_key >= input_temp:
total_number = temp_map[temp_key] + total_number
temp_map[temp_key] = 0
temp_sum = 0
# 根据修改后的字典计算总和
for j in temp_map.keys():
temp_sum += j * temp_map[j]
# 计算最终总数
total_number = int(temp_sum // input_temp) + total_number
# 输出结果
print(total_number)
def main():
"""
这是主函数。
"""
some_instance = SomeClass()
some_instance.new_function(3, 5)
modified_logic()
if __name__ == "__main__":
main()
C算法源码
#include <stdio.h>
#define MAX_SIZE 20
#define x MAX_SIZE
#define y 50
static int unusedVariable = 0;
typedef struct Example {
int dummy; // 一个示例成员变量
} Example;
/
void unrelatedFunction() {
// 函数体
}
//的原型声明
void newFunction(int parameter);
// 函数:getResultModified
// 参数:
// - R: 整数,范围
// - M: 整数数组,包含一系列整数
// - Z: 整数,某值
// 返回值:
// - 整数,计算结果
int getResultModified(int R, int M[], int Z);
// 函数:binarySubtraction
// 参数:
// - greater: 整数数组,较大的二进制数
// - lesser: 整数数组,较小的二进制数
// - dimension: 整数,数组维度
// 返回值:
// - 整数,表示是否进行了借位
int binarySubtraction(int greater[], int lesser[], int dimension);
// 函数:calculateBinary
// 参数:
// - binaryArray: 整数数组,二进制数
// - binaryDimension: 整数,数组维度
// 返回值:
// - 整数,计算的十进制值
int calculateBinary(const int binaryArray[], int binaryDimension);
// 主函数
int main() {
int R;
scanf("%d", &R);
int M[x] = {0};
int index = 0;
while (index <= R) {
scanf("%d", &M[index++]);
}
int Z;
scanf("%d", &Z);
printf("%d\n", getResultModified(R, M, Z));
return 0;
}
// 函数实现:getResultModified
int getResultModified(int R, int M[], int Z) {
int lesser[y];
int lesserDimension = 0;
while (Z > 0) {
lesser[lesserDimension++] = Z % 2;
Z /= 2;
}
int tally = 0;
for (int i = R; i >= lesserDimension; i--) {
tally += M[i];
}
int greater[lesserDimension];
for (int i = 0; i < lesserDimension; i++) {
greater[i] = M[i];
}
while (binarySubtraction(greater, lesser, lesserDimension)) {
tally++;
}
return tally;
}
// 函数实现:binarySubtraction
int binarySubtraction(int greater[], int lesser[], int dimension) {
for (int i = dimension - 1; i >= 0; i--) {
if (greater[i] >= lesser[i]) {
greater[i] -= lesser[i];
} else {
if (calculateBinary(greater, i + 1) < calculateBinary(lesser, i + 1)) {
int j = i + 1;
while (j < dimension) {
if (greater[j] > 0) {
greater[j] -= 1;
return 1;
} else {
j += 1;
}
}
return 0;
} else {
greater[i] -= lesser[i];
greater[i - 1] += greater[i] << 1;
greater[i] = 0;
}
}
}
return 1;
}
// 函数实现:calculateBinary
int calculateBinary(const int binaryArray[], int binaryDimension) {
int result = 0;
for (int i = 0; i < binaryDimension; i++) {
result += binaryArray[i] * (1 << i);
}
return result;
}
// 函数实现:newFunction
void newFunction(int parameter) {
// 函数实现
}
Java算法源码
import java.util.Scanner;
public class Main {
// 获取结果
public static int getResult(int R, int[] N, int D) {
// 定义 subtrahend 数组和 subtrahendSize 变量
int[] subtrahend = new int[50];
int subtrahendSize = 0;
// 将 D 转换为二进制并逆序存储到 subtrahend 数组中以匹配 N[] 的顺序
while (D > 0) {
subtrahend[subtrahendSize++] = D % 2;
D /= 2;
}
// 记录可以容纳 D 的通道数
int count = 0;
// N 中的高阶通道可以容纳一个 D,因此计数它们
for (int i = R; i >= subtrahendSize; i--) {
count += N[i];
}
// 计算无法独立容纳一个 D 的 0 到 subtrahendSize - 1 通道,它们需要结合起来容纳一个 D
int[] minuend = new int[subtrahendSize];
System.arraycopy(N, 0, minuend, 0, subtrahendSize);
// 执行二进制减法
while (binarySub(minuend, subtrahend, subtrahendSize)) {
count++;
}
return count;
}
// 二进制减法
public static boolean binarySub(int[] minuend, int[] subtrahend, int size) {
for (int i = size - 1; i >= 0; i--) {
if (minuend[i] >= subtrahend[i]) {
minuend[i] -= subtrahend[i];
} else {
if (calcBin(minuend, i + 1) < calcBin(subtrahend, i + 1)) {
int j = i + 1;
while (j < size) {
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;
}
}
}
return true;
}
// 计算二进制
public static int calcBin(int[] bin, int binSize) {
int ans = 0;
for (int i = 0; i < binSize; i++) {
ans += bin[i] * (1 << i);
}
return ans;
}
// 主函数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 获取输入
int R = scanner.nextInt();
int[] N = new int[R + 1];
for (int i = 0; i <= R; i++) {
N[i] = scanner.nextInt();
}
int D = scanner.nextInt();
// 输出结果
System.out.println(getResult(R, N, D));
}
}
3 条评论
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]