前言
本文记录4月13日晚7点一场软件开发岗笔试的题目,思路以及代码实现。
一、题目简介
题目:
硬件资源的最佳分配
具体描述:
有M台服务器资源,每台服务器包含属性:
编号(整数),CPU核数(1-100)、内存(10-1000)、CPU架构(0-8)、是否支持NP加速卡标识(0,1)。
请根据资源分配要求分配N台满足要求的服务器。资源分配要求:
CPU核数>=cpuCount,内存>=memsize,CPU架构=cpuArch,是否支持NP卡=supportNP.其中,cpuCount.memSize.cpuArch.supportNP为输入的分配参数。
分配时同时会指定优选级策略strategy,策略如下:
策略1:CPU优先,表示优选CPU核数满足分配要求并最接分配要求的cpuCount.当CPU核数相同时,再按内存满足要求并最接近memSize的服务器分配。
策略2:内存优先,表示优选内存满足分配要求并最接近分配要求的memsize.当内存相同时,再按CPU核数满足要求并最接i近cpuCount的服务器分配。
如果两台服务器属性都相同,则按服务器编号从小到大选择(编号不会重复)
输入输出:
输入
第一行服务器数量M台
接下来M行为M台服务器属性的数组
紧接下一行为分配要求:最大分配数量N,分配策略srategy,cpuCount,memsize,cpuArch,supportNP
其中:
1<=M<=1000
strategy:1表示策略1,2表示策略2
1<=cpuCount<=100
10<=memSize<=1000
0<=cpuArch<=8,另外,cpuArch使用9表示所有CPU架构都满足分配要求
0<=SuppOrtNP<=1,另外,supportNP为2时表示不论是否支持NP卡都满足分配要求
输出
先输出实际分配数量,后按分配的服务器编号从小到大依次输出,以空格间隔
样例:
输入:4
0 2 200 0 1
1 3 400 0 1
2 3 400 1 0
3 3 300 0 1
3 1 3 200 0 1
输出:2 1 3
二、思路
本体看上去非常复杂,实则不然,只是简单的排序问题,实现起来只有两个要注意的点,一个是排序规则,另一个就是要求按序输出满足要求并最接近分配要求的服务器,这个实现起来需要想一想怎么弄比较巧妙。
我的思路是先根据优选级策略对所有服务器排序,这里的排序使用升序,可以简单的理解为“越前面越可能不满足要求,越后面越不满足要求”,这样第一次排序后我们就可以从排序后的服务器容器中从前向后遍历判断其是否满足要求,这个遍历的结果必然是前面一段不满足要求,后面一段满足要求,并且因为第一次排序是升序排序,因此在把后面一段压入答案时,必然是后面一段靠前面的元素更接近分配要求,这样就满足了题目要求。最后注意一点,如果输出时按cout >> item >> ’ '的话最后会多一个空格导致判错,所以需要把答案弄成字符串并删除字符串的最后一个元素也就是最后一个空格,这样输出就没有问题了。
三、C++代码实现
#include <iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
struct node {
int id, cpu, mem, arch, support;
};
bool cmp1(node &a, node &b)
{
if (a.cpu != b.cpu) return a.cpu < b.cpu;
if (a.mem != b.mem) return a.mem < b.mem;
else return a.id < b.id;
}
bool cmp2(node &a, node &b)
{
if (a.mem != b.mem) return a.mem < b.mem;
if (a.cpu != b.cpu) return a.cpu < b.cpu;
else return a.id < b.id;
}
int main()
{
int n;
cin >> n;
vector<node> ser(n);
for (int i = 0; i < n; i++) {
cin >> ser[i].id >> ser[i].cpu >> ser[i].mem >> ser[i].arch >> ser[i].support;
}
int N, startegy, cpucount, memsize, arch, NP;
cin >> N >> startegy >> cpucount >> memsize >> arch >> NP;
if (startegy == 1) sort(ser.begin(), ser.end(), cmp1);
else sort(ser.begin(), ser.end(), cmp2);
vector<int> ans;
for (int i = 0; i < n; i++) {
if (ser[i].cpu >= cpucount && ser[i].mem >= memsize && (ser[i].arch == arch || arch == 9) && (ser[i].support == NP || NP == 2))
ans.push_back(ser[i].id);
if (ans.size() >= N)
break;
}
sort(ans.begin(), ans.end());
string res = to_string(ans.size()) + " ";
for (auto item : ans)
res += to_string(item) + " ";
res = res.substr(0, res.size() - 1);
cout << res << endl;
return 0;
}
总结
总体来讲HW第一题相对还是比较简单的,基本不考察算法,还是看个人C++基础水平,平时一定要多敲代码,保证熟练掌握C++的各种代码操作。
牛刀小试,继续努力,总有一天会成为真正的卷王!