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

本文通过使用C++实现了一个算法,解决了一面砖墙问题,即如何通过划分竖线使得竖线穿过的砖块数量最少。算法利用了map数据结构来统计裂缝的位置,并找出最大裂缝数,以此确定最优切割点。
原题链接

一面砖墙

算法分析

设墙的宽度为 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;
}

转载于:https://www.cnblogs.com/dongling/p/6659492.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值