hihocoder [Offer收割]编程练习赛12 [1494] ---- 一面砖墙

原题链接

一面砖墙

算法分析

设墙的宽度为 range,则需要统计横坐标为 1,2,3,4,...,range-1 处的墙缝数,取最大的墙缝数(记为maxCrevices),从该处划一道竖线,竖线穿过的砖块数据最少,为N-maxCrevices;当然,输数据中不可能所有的坐标处都有裂缝,所以,我们只需考虑有裂缝的坐标处就行了。这里需要用到map<int,int>数据结构,key 为坐标,value 为该坐标处的裂缝数。统计出最大的裂缝数就能解决问题了。

C++算法实现:

#include<iostream>
#include<map>
using namespace std;



int main(int argc, char* argv[])
{
	int maxCrevices = 0;
	map<int, int> crevices;//裂缝数统计
	int N, num, len, width;
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> num;
		len = 0;
		for (int j = 1; j < num; j++) {
			cin >> width;
			len += width;//每块砖头的右边界算作缝隙位置
			auto ret = crevices.insert({ len,1 });
			if (!ret.second) {// 说明之前存在该项,插入不成功,直接在原值上加1进行修改
				++ret.first->second;
			}
			if (ret.first->second > maxCrevices) {//最终将得到最大的裂缝数
				maxCrevices = ret.first->second;
			}
		}
		cin >> width;//每一层的最后一块砖头无需考虑,因为这块砖头的右边界不算缝隙
	}
	cout << N - maxCrevices;
	return 0;
}
posted @ 2017-04-02 18:04  HorseShoe2016  阅读(316)  评论(0编辑  收藏  举报