赞
踩
算法工程师小明面对着这样一个问题 ,需要将通信用的信道分配给尽量多的用户:
信道的条件及分配规则如下:
给出一组信道资源,最多可以为多少用户传输数据?
第一行,一个数字 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
4
最大阶数为5.
信道阶数 | 信道容量 | 信道个数 |
---|---|---|
0 | 1 | 10 |
1 | 2 | 5 |
2 | 4 | 0 |
3 | 8 | 1 |
4 | 16 | 3 |
5 | 32 | 2 |
单个用户需要传输的数据量为30
可能存在很多分配方式,举例说明:
分配方式1:
- 32 * 1 = 32
- 32 * 1 = 32
- 16 * 2 = 32
- 16 * 1 + 8 * 1 + 2 * 3 =30
剩下 2 * 2 + 1 * 10 = 14 不足以再分一个用户了
分配方式2:
- 16 * 1 + 8 * 1 + 2 * 3 =30
- 16 * 1 + 2 * 2 + 1 * 10 =30
- 32 * 1 =32
- 32 * 1 = 32
剩下 16*1 = 16 不足以再分一个用户了。
分配方式3:
- 16 * 1 + 8 * 1 + 2 * 3 =30
- 16 * 1 + 2 * 2 + 1 * 10 = 30
- 32 * 1 = 32
- 32 * 1 = 32
恰好用完。
虽然每种分配方式剩下的容量不同,但服务的用户数量是一致的。因为这个问题中我们只关心服务的用户数,所以我们认为这些分配方式等效。
#include <iostream> #include <vector> #include <algorithm> #include <set> using namespace std; int main() { int r, d; cin >> r; vector<int> N(r+1); multiset<int> mset; int count = 0; for (int i = 0; i <=r; ++i) { cin >> N[i]; } cin >> d; for(int j = 0; j<=r;j++) { if((2^j)>d) //比较大的信道 直接加上 { count = count +N[j]; } else //比较小的信道 { for (int k = 0; k < N[j]; ++k) { mset.insert(1 << j); } } } int object = d; cout<<d<<endl; while(object>0 && (mset.size())) //object 可能永远大于0 ,所以要看集合大小 { object = object-*mset.rbegin(); //用集合最大元素抵消 mset.erase(std::prev(mset.end())); // 删除最大元素 if(object <= 0) //说明凑齐了目标d cnt++ { count++; object = d; } } cout<<count<<endl; return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。