最近微软出了一到题目,据说只有2%的程序员答对了,什么题目呢,我们一起看看吧
题目描述:
在微软云计算服务的机房,有很多机器上跑着一个或者多个的虚拟机。在一段时间里,有很多用户会来请求建立虚拟机,或者把虚拟机关闭。这个时候,一个最重要的问题,是如何把用户的请求分配到不同的机器上。这里我们把实际的问题简化成对CPU的申请。
假定有M台机器用来服务用户,我们把机器编号成0到M。每台机器有多个CPU核,我们把核编号为0到Cm。
当用户在申请资源的时候,会生成一个请求 “申请<k>个核”,并且每个请求编号为m如果我们在现有的机器中能找到一台机器能满足,这台机器的空余的连续的核能满足要求的话,就返回<M, C>作为结果。M是机器的下标,C是申请的第一个核的下标。如果没有找到能满足请求的机器,<-1,
-1>作为结果。
当用户释放资源的时候,生成一个请求”第m个请求的资源释放”。保证一个请求释放最多一次。如果请求没有满足,忽略释放的请求。
输入
第一行是T, 总共的测试的个数
每个测试,第一行给出M 和Q,机器的总数和请求的个数
接下来是M行给出每一台机器的核数 Ci
接下来Q行给出请求。请求两种格式,
1. A k 表示申请k个核
2. F m 表示释放第m个请求申请的核
输出
对于每一个测试,首先输出
“Case #i:” i是测试的标号,从1开始。
接下来对于所有申请的请求,输出m c 或者-1
-1
[限制条件]
1 <= T <= 20
1 <= M <= 100000
1 <= Ci <= 128
1 <= Q <= 1000000
1 <= k <= 128
1 <= m <= M
The number of queries of type 1 is the same
as that of type 2.
正确答案代码展示
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <set>
- #include <cstring>
-
- using namespace std;
- const int N = 100005;
- const int M = 130;
- const int inf = 1e9;
-
- struct Query{
- int id, start, end;
- Query (){}
- Query (int a, int b, int c):id(a), start (b), end (c){}
- };
- bool a[N][M];
- int sz[N];
-
-
-
-
- int getStart (bool used[], int size, int num){
- int now = 0;
- for (int i = 1; i <= size; i ++){
- if (!used[i]){
- now ++;
- if (now == num){
- return i - now + 1;
- }
- }else{
- now = 0;
- }
- }
- return -1;
- }
-
-
-
-
- int getMax (bool used[], int size){
- int maxx = 0;
- int t = 0;
- for (int i = 1; i <= size; i ++){
- if (!used[i]){
- t ++;
- maxx = max (maxx, t);
- }else{
- t = 0;
- }
- }
- return maxx;
- }
-
- int main (){
- freopen ("1.txt", "r", stdin);
- freopen ("3.txt", "w", stdout);
- int T, cas = 1;
- scanf ("%d", &T);
- while (T --){
- memset (a, 0, sizeof (a));
- set<int> se[M];
- vector<Query> vec;
- printf ("Case #%d:\n", cas ++);
- int n, m;
- scanf ("%d%d", &n, &m);
- for (int i = 1; i <= n; i ++){
- scanf ("%d", sz + i);
- se[sz[i]].insert (i);
- }
- while (m --){
- char op[5];
- int t;
- scanf ("%s%d", op, &t);
- if (op[0] == 'A'){
- int id = inf;
- for (int i = t; i < M; i ++){
- if (se[i].size ()){
- id = min (id, *se[i].begin ());
- }
- }
- if (id == inf){
- puts ("-1 -1");
- vec.push_back (Query (-1, -1, -1));
- }else{
- se[ getMax (a[id], sz[id]) ].erase (id);
- int start = getStart (a[id], sz[id], t);
- printf ("%d %d\n", id, start);
- for (int i = start; i <= start + t - 1; i ++){
- a[id][i] = true;
- }
- vec.push_back (Query (id, start, start + t - 1));
- se[ getMax (a[id], sz[id])].insert (id);
- }
- }else{
- t --;
- if (vec[t].id == -1) continue;
- int id = vec[t].id;
- se[ getMax (a[id], sz[id]) ].erase (id);
- for (int i = vec[t].start; i <= vec[t].end; i ++){
- a[id][i] = false;
- }
- se[ getMax (a[id], sz[id]) ].insert (id);
- }
- }
- }
- }