2017Facebook面试题改编“一面砖墙 ”
题目:一面砖墙
这道题改编自网上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 }
运行结果如下:
以上总结仅供参考,若有不对之处,敬请谅解。
未经本人同意,不得转载,谢谢合作!