前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯省模拟赛第十题(淹没城堡)

蓝桥杯省模拟赛第十题(淹没城堡)

作者头像
六月丶
发布2022-12-26 17:46:14
1590
发布2022-12-26 17:46:14
举报
文章被收录于专栏:六月-游戏开发六月-游戏开发

题目

有一片长n宽m的地方,上面有n个方块,该地图是立体的,所以方块可以叠加,地图数值代表在该坐标下有叠加的方块个数,现在有高h的水要淹没这片地方,请输出从水高度为1~h,被淹没的方块个数分别为多少。

样例输入

输入第一行为n和m,表示地图长和宽,然后是n行,每行m个数表示方块个数,最后一行输入一个h表示水的最高高度。 3 4 9 3 3 1 3 3 3 0 0 0 0 0 10

样例输出

7 13 19 20 21 22 23 24 25 25

数据范围

1<=n,m<=1000 1<=h<=100000 方块个数<1000000000

思路

虽然数据是二维的,但根据题意,即使把所有行连起来摆放也不影响,其次因为水的高度不算太高,数据不会太散,所以可以用桶排存储进一维数组,桶排不仅快(O(n))而且可以直接知道叠加高度为idx的方块列数有多少。

代码语言:javascript
复制
#define H 100005
long long tong[H] = {0};        
for(int i = 1;i <= n*m;i++){
    cin >> tmp;
    tmp = tmp>H?H:tmp;      //对于叠加高过最高水位的,直接让它高度=水位最高高度
    cin >> tong[i];
}

因为最高水位有十万,所以肯定要用到动规。申请一个数组hs,用于存储每一层淹没方块数量,从h层开始向下遍历,每一层淹没数量 = 叠加高度大于这一层的列数+叠加高度小于等于这一层的列数*该列方块数。

代码语言:javascript
复制
for(int i = h;i > 0;i--){
    hs[i] = tong[i]+fugai;
    fugai+=tong[i];
}

但每一层高度的方块,这一层能淹没,比他高的层数一定也能淹没,所以i+(h-i)层都需要加i层方块数量,但是如果用循环来加时间复杂度就为O(h^2),所以这个累加数据也要用动规,用一个数组leijia,存储比下标高的每层水位需要加的淹没方块数量。 那么最后从底向上来一遍leijia[i]+=leijia[i-1]即可。

完整代码

代码语言:javascript
复制
#include<iostream>
#include<cstdio>
#define H 100001

using namespace std;

int tong[100005];           //高度为下标的方块列数 
long long hs[100005];       //每层淹没数量 
long long leijia[100005];   //高度大于下标的水位额外淹没数量 
int fugai;                  //高度大于当前h的列数         
int main(){
    int n,m,h,tmp;
    cin >> n >> m;
    for(int i = 0;i < n*m;i++){
        cin >> tmp;
        if(tmp>H){
            tmp = H;
        }
        tong[tmp]++;
    }
    cin >> h;
    for(int i = h+1;i <= H;i++){
        fugai+=tong[i];
    }
    for(int i = h;i > 0;i--){
        hs[i] = tong[i]+fugai;
        leijia[i] = tong[i]+fugai;
        fugai+=tong[i];
    }
    for(int i = 1;i <= h;i++){
        leijia[i] += leijia[i-1];
        hs[i] += leijia[i-1];
        cout << hs[i]<< endl;
    }

    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020 年 04 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
    • 样例输入
      • 样例输出
        • 数据范围
        • 思路
        • 完整代码
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档