• 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;
    }
  • 相关阅读:
    [原]减小VC6编译生成的exe文件的大小
    [原]可用代码
    [原]BlogTemplate
    [原]Excel VBA数据校验
    Favorite
    [原]隐藏cnblogs侧边栏
    [原]Skills
    UI现在就升级到Windows7
    redis 笔记
    1 Two Sum(LeetCode HOT 100)
  • 原文地址:https://www.cnblogs.com/dongling/p/6659492.html
Copyright © 2020-2023  润新知