#include <iostream>
#include <list>
#include <cmath>
using namespace std;
// 信道分配
static void HuaWei_OD_test24(void)
{
int max_r; // 信道最大阶数
int *cnt_r = new int[max_r + 1]; // 每种信道对应数量
list<int> capcity_list; // 每种信道的容量
cin >> max_r;
for (int i = 0; i <= max_r; i++)
{
cin >> cnt_r[i];
int capcity = pow(2, i);
for (int j = 0; j < cnt_r[i]; j++)
{
capcity_list.push_front(capcity); // 希望按照容量进行降序排列
}
}
int data_size;
cin >> data_size;
int allocate_user = 0; // 可分配用户数量
int cap_sum = 0; // 当单个信道不足以发送data_size数据,使用此变量记录积攒的容量
// 信道阶数越高信道容量越大,从大到小分配信道
// 此时capcity_list是降序
auto cap_pos = capcity_list.begin();
for (; cap_pos != capcity_list.end(); cap_pos++)
{
// 单个的容量即满足发送条件
if (*cap_pos >= data_size)
{
allocate_user++;
continue;
}
else
{
// 需要积累多个信道,这里下一个信道容量 <= 当前信道容量
cap_sum += *cap_pos;
if (cap_sum >= data_size)
{
allocate_user++;
cap_sum = 0;
continue;
}
}
}
cout << allocate_user << endl;
delete cnt_r;
}
int main()
{
HuaWei_OD_test24();
return 0;
}
2024年华为OD机试真题-信道分配 C/C++解法
最新推荐文章于 2024-09-04 16:13:19 发布