码迷,mamicode.com
首页 > 其他好文 > 详细

2017Facebook面试题改编“一面砖墙 ”—— 通过使用哈希表进行枚举优化

时间:2018-06-11 19:34:27      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:运行   比较   长度   value   key   jpg   alt   include   ret   

题目:一面砖墙

这道题改编自网上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面试题改编“一面砖墙 ”—— 通过使用哈希表进行枚举优化

标签:运行   比较   长度   value   key   jpg   alt   include   ret   

原文地址:https://www.cnblogs.com/Tuple-Joe/p/9168621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!