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 }

 

运行结果如下:

 

posted on 2018-06-11 19:11  Tuple  阅读(610)  评论(0编辑  收藏  举报

导航