1. 程式人生 > >2017Facebook面試題改編“一面磚墻 ”—— 通過使用哈希表進行枚舉優化

2017Facebook面試題改編“一面磚墻 ”—— 通過使用哈希表進行枚舉優化

ems 思路 bubuko include 是我 比較 code .com 什麽

題目:一面磚墻

這道題改編自網上Facebook去年的一道面試題,是hihoCoder的1494題(https://hihocoder.com/problemset/problem/1494)

技術分享圖片

  這道題猛一看好像沒有什麽思路,枚舉起來感覺挺麻煩的。為了描述方便,我們在水平方向建立一個X軸,X=0的位置設成這面墻的左邊緣。X軸的長度單位與磚的長度單位保持一致:
技術分享圖片     這樣對於每一個磚和磚之間交界的縫隙,都有一個X坐標。比如第一層天藍色的縫隙,X坐標就是6,深藍色的縫隙坐標就是10;第二層紅色的縫隙坐標是8;第三層綠色的縫隙坐標是11。現在假設我要在X=a這個位置畫一條豎線,這條線穿過了多少塊磚,顯然取決於X=a這個位置有多少個縫隙。這個位置的縫隙越多,穿過的磚數目就越少。於是我們有了一個比較清楚的枚舉算法。首先計算所有磚塊交界縫隙的坐標,看哪個坐標的縫隙最多,我們就在哪個坐標畫線,這樣穿過的磚塊肯定最少。我們可以用unordered_map來做,key是縫隙的坐標,value是處於這個坐標的縫隙數量。 代碼如下:
 1
#include <iostream> 2 #include <unordered_map> 3 using namespace std; 4 5 int main() 6 { 7 int n; //層數 8 int num; //每層的個數 9 int x; //橫坐標 10 int width; //磚塊的寬度 11 unordered_map<int, int> cnt; 12 13 cin >> n; 14 for(int
i = 0; i < n; i++) 15 { 16 cin >> num; 17 x = 0; 18 for(int j = 0; j < num; j++) 19 { 20 cin >> width; 21 x += width; 22 if(j != num - 1) //排除磚墻的右邊沿的劃線 23 cnt[x]++; 24 } 25 } 26 27
int max = 0; 28 for(auto item : cnt) //auto是C++11標準裏的關鍵字 29 { 30 if(item.second > max) 31 max = item.second; 32 } 33 cout << n - max << endl; 34 35 return 0; 36 }

運行結果如下:

技術分享圖片

2017Facebook面試題改編“一面磚墻 ”—— 通過使用哈希表進行枚舉優化