多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 微軟面試題只有2%的人能回答

微軟面試題只有2%的人能回答

來源:程序員人生   發布時間:2014-08-28 21:48:42 閱讀次數:3975次
最近微軟出了一到題目,據說只有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.

正確答案代碼展示

  1. #include <iostream> 
  2. #include <cstdio> 
  3. #include <vector> 
  4. #include <set> 
  5. #include <cstring> 
  6.  
  7. using namespace std; 
  8. const int N = 100005; 
  9. const int M = 130; 
  10. const int inf = 1e9; 
  11.  
  12. struct Query{    //保存每一次詢問的結果,id為機器編號,start為CPU起點,end為CPU終點 
  13.     int id, start, end;     
  14.     Query (){} 
  15.     Query (int a, int b, int c):id(a), start (b), end (c){} 
  16. }; 
  17. bool a[N][M];        //記錄每個機器CPU的使用情況 
  18. int sz[N];            //記錄每個機器CPU數 
  19.  
  20. /* 
  21.  * 返回當前機器中連續num個空閑核的起點 
  22.  */ 
  23. int getStart (bool used[], int size, int num){ 
  24.     int now = 0; 
  25.     for (int i = 1; i <= size; i ++){ 
  26.         if (!used[i]){ 
  27.             now ++; 
  28.             if (now == num){ 
  29.                 return i - now + 1; 
  30.             } 
  31.         }else
  32.             now = 0; 
  33.         } 
  34.     } 
  35.     return -1; 
  36.  
  37. /* 
  38.  * 返回當前機器最大連續空閑核的數量 
  39.  */ 
  40. int getMax (bool used[], int size){ 
  41.     int maxx = 0; 
  42.     int t = 0; 
  43.     for (int i = 1; i <= size; i ++){ 
  44.         if (!used[i]){ 
  45.             t ++; 
  46.             maxx = max (maxx, t); 
  47.         }else
  48.             t = 0; 
  49.         } 
  50.     } 
  51.     return maxx; 
  52.  
  53. int main (){ 
  54.     freopen ("1.txt""r", stdin); 
  55.     freopen ("3.txt""w", stdout); 
  56.     int T, cas = 1; 
  57.     scanf ("%d", &T); 
  58.     while (T --){ 
  59.         memset (a, 0, sizeof (a)); 
  60.         set<int> se[M];        //se[i]存儲的是連續空閑數為i的所有機器編號 
  61.         vector<Query> vec;    //保存歷史詢問 
  62.         printf ("Case #%d:\n", cas ++); 
  63.         int n, m; 
  64.         scanf ("%d%d", &n, &m); 
  65.         for (int i = 1; i <= n; i ++){ 
  66.             scanf ("%d", sz + i); 
  67.             se[sz[i]].insert (i); 
  68.         } 
  69.         while (m --){ 
  70.             char op[5]; 
  71.             int t; 
  72.             scanf ("%s%d", op, &t); 
  73.             if (op[0] == 'A'){ 
  74.                 int id = inf; 
  75.                 for (int i = t; i < M; i ++){ 
  76.                     if (se[i].size ()){ 
  77.                         id = min (id, *se[i].begin ()); 
  78.                     } 
  79.                 } 
  80.                 if (id == inf){ 
  81.                     puts ("-1 -1"); 
  82.                     vec.push_back (Query (-1, -1, -1)); 
  83.                 }else
  84.                     se[ getMax (a[id], sz[id]) ].erase (id); 
  85.                     int start = getStart (a[id], sz[id], t); 
  86.                     printf ("%d %d\n", id, start); 
  87.                     for (int i = start; i <= start + t - 1; i ++){ 
  88.                         a[id][i] = true
  89.                     } 
  90.                     vec.push_back (Query (id, start, start + t - 1)); 
  91.                     se[ getMax (a[id], sz[id])].insert (id); 
  92.                 } 
  93.             }else
  94.                 t --; 
  95.                 if (vec[t].id == -1)    continue
  96.                 int id = vec[t].id; 
  97.                 se[ getMax (a[id], sz[id]) ].erase (id); 
  98.                 for (int i = vec[t].start; i <= vec[t].end; i ++){ 
  99.                     a[id][i] = false
  100.                 } 
  101.                 se[ getMax (a[id], sz[id]) ].insert (id); 
  102.             } 
  103.         } 
  104.     } 

 

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: a成人| 色老头福影院韩国激情影院 | 日本免费区 | 女女同性一区二区三区四区 | 国产精品久久久久久久久久久久久久 | 久久受www免费人成看片 | 无人区理论片手机看片 | 国内精品一区视频在线播放 | 国产亚洲精品国看不卡 | xxxxx性欧美hd另类 | 亚洲一区二区三区四区在线 | 日本中文在线 | 中文字幕在线看片 | 69精品视频| 亚洲成人网在线 | 91精品一区二区三区在线播放 | 国产成人一区二区三区在线播放 | 日韩欧美亚洲国产高清在线 | 国内精品久久久久久久亚洲 | 欧美a级v片不卡在线观看 | 国内精品视频九九九九 | 在线观看男女男免费视频 | 国产福利免费看 | 欧美一区二区三区免费播放 | 国产欧美精品区一区二区三区 | 久久精品免费观看 | 尤物精品在线观看 | 日本在线无 | 大香焦伊人 | 欧美亚洲精品在线 | 伊人影院在线观看视频 | 国产三级高清 | 亚洲一区二区高清 | 波多野结衣在线免费观看视频 | 亚洲人成网站999久久久综合 | 天天天做天天天天爱天天想 | 一区二区三区久久精品 | 校园 图片区 视频 小说专区 | 日韩亚洲欧美日本精品va | 欧美精品日韩一区二区三区 | 激情老妇xxx |