华为机试 - 探索地块建立

news2024/9/16 16:55:44

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

给一块n*m的地块,相当于n*m的二维数组,每个元素的值表示这个小地块的发电量;

求在这块地上建立正方形的边长为c的发电站,发电量满足目标电量k的地块数量。

输入描述

第一行为四个按空格分隔的正整数,分别表示n, m , c k

后面n行整数,表示每个地块的发电量

输出描述

输出满足条件的地块数量

用例

输入2 5 2 6
1 3 4 5 8
2 3 6 7 1
输出4
说明

题目解析

本题最直观地解法,请看下面代码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
let n, m, c, k;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    [n, m, c, k] = lines[0].split(" ").map(Number);
  }

  if (n && lines.length === n + 1) {
    const matrix = lines.slice(1).map((line) => line.split(" ").map(Number));

    console.log(getResult(matrix, n, m, c, k));

    lines.length = 0;
  }
});

function getResult(matrix, n, m, c, k) {
  let count = 0;

  if (n < c || m < c) return count;

  for (let i = 0; i <= n - c; i++) {
    for (let j = 0; j <= m - c; j++) {
      if (getSum(matrix, i, j, c) >= k) {
        count++;
      }
    }
  }

  return count;
}

function getSum(matrix, row, col, c) {
  let sum = 0;
  for (let i = row; i < row + c; i++) {
    for (let j = col; j < col + c; j++) {
      sum += matrix[i][j];
    }
  }
  return sum;
}

但是这种解法中,存在了大量地重复计算,比如

上面图示矩阵,如果从橙色正方形位置,下移一行,变动到红框正方形位置,按照上面逻辑需要对红框正方形中元素重新求和。

但是实际上,我们只需要基于橙色正方形(已经计算过和)减去 失去的一行,加上新增的一行即可。

可能这么看,计算量并没有节省多少,但是一旦正方形很大,则节省的计算量还是非常可观的。

 并且我们还可以将“新增的行”计算得到的和缓存起来,因为如果数据量足够大,“新增的行”也会有变成“失去的行”的时候

这样又可以节省一些计算量 。

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
let n, m, c, k;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    [n, m, c, k] = lines[0].split(" ").map(Number);
  }

  if (n && lines.length === n + 1) {
    const matrix = lines.slice(1).map((line) => line.split(" ").map(Number));

    console.log(getResult(matrix, n, m, c, k));

    lines.length = 0;
  }
});

function getResult(matrix, n, m, c, k) {
  let count = 0;

  if (n < c || m < c) return count;

  let sum = 0;
  for (let i = 0; i < c; i++) {
    for (let j = 0; j < c; j++) {
      sum += matrix[i][j];
    }
  }

  const rows = {};
  function zipR(row) {
    return rows[row]
      ? rows[row]
      : (rows[row] = matrix
          .slice(row, row + 1)
          .slice(0, c)
          .reduce((p, c) => p + c));
  }

  const cols = {};
  function zipC(row, col) {
    const key = `${row}-${col}`;

    return cols[key]
      ? cols[key]
      : (cols[key] = matrix
          .slice(row, row + c)
          .reduce((p, c) => p[col] + c[col]));
  }

  const dp = new Array(n - c + 1)
    .fill(0)
    .map(() => new Array(m - c + 1).fill(0));
  dp[0][0] = sum;

  if (dp[0][0] >= k) count++;

  let i = 0,
    j = 0;
  for (; i <= n - c; i++) {
    if (i !== 0) {
      dp[i][j] = dp[i - 1][j] - zipR(i - 1) + zipR(i + c - 1);
      if (dp[i][j] >= k) count++;
    }

    for (; j <= m - c; j++) {
      if (i === 0 && j === 0) continue;
      dp[i][j] = dp[i][j - 1] - zipC(i, j - 1) + zipC(i, j + c - 1);
      if (dp[i][j] >= k) count++;
    }
  }

  return count;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车保养app开发,扩充汽车服务市场发展商机

从汽车市场规模来看&#xff0c;从2017年开始始终保持增长的发展趋势&#xff0c;在2021年市场规模达到140877.18亿元。互联网时代发展下&#xff0c;汽车后市场大力推广电子商务&#xff0c;将互联网技术与汽车保养服务相结合是汽车服务行业强大的必由之路。二者的结合可以让消…

centos7下搭建rabbitmq的开发环境

我们在项目开发的时候都不可避免的会有异步化的问题,比较好的解决方案就是使用消息队列,可供选择的队列产品也有很多,比如轻量级的redis, 当然还有重量级的专业产品rabbitmq,rabbitmq好就好在是用erlang(二郎神)开发的,它那天生的OTP并行计算框架,轻而易举的进程间通…

阿里云ssl免费证书申请

目录为什么申请SSL证书SSL证书申请支持的域名类型ssl免费证书申请过程为什么申请SSL证书 由于web服务部署需要使用https安全协议&#xff0c;因此需要申请相应域名的SSL证书用于部署。测试阶段&#xff0c;为节省成本&#xff0c;使用阿里云提供的免费SSL证书。 SSL证书申请支…

在Web服务器(IIS)上安装SSL证书并绑定网站

以windows server 2016为例 一、安装中间证书 1.下载中间证书文件 如果是RSA加密算法类的&#xff0c;下载此处。 如果是ECC加密算法类的&#xff0c;下载此处。 2.安装 双击下载好的文件进行安装&#xff0c;注意&#xff0c;安装过程中&#xff0c;存储位置要设”为本地…

搜题接口系统

搜题接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xff09; 题库…

分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类)

分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类) 目录 分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类)效果一览基本介绍程序设计学习总结参考资料效果一览 训练集正确率Accuracy = 89%(445/500) 测试集正确率Accuracy = 86.9565%(60/69) 基本介绍 MATLA…

加载器、反射、xml、DTD、schema、注解、单元测试

一、什么是类加载器 类加载器 类加载器&#xff1a;负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 类加载的过程 类加载时机 类在什么时候会被加载到内存中呢&#xff1f; 类加载时机 创建类的实例&#xff08;对象&#xff09;调用类的类方法 访问…

微服务自动化【idea插件一键部署】

目录​​​​​​​ 1. Docker结合Idea插件使用 2. 私服搭建 registry 3. 私有仓库的使用 4. idea一键项目部署单独Docker镜像 5. idea一键项目部署Docker标记镜像【私库】 1. Docker结合Idea插件使用 1. 修改Docker服务文件,注释掉"ExecStart"这一行&#x…

火爆的超级人工智能ChatGPT,唯独鄙视中国人

ChatGPT你听说了吗&#xff1f;如果ChatGPT你还没有听说&#xff0c;作为一名程序员&#xff0c;那可能你就out了。使用ChatGPT受阻&#xff0c;为什么不让我们用&#xff1f;它是一款神器&#xff0c;很有意思&#xff0c;当前被大家众星捧月&#xff0c;初次用起来确实很神奇…

微服务框架 SpringCloud微服务架构 22 DSL 查询语法 22.5 相关性算分

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构22 DSL 查询语法22.5 相关性算分22.5.1 复合查询22.5.2 相关性算分22.5.3 …

前端精准测试实践

作者&#xff1a;京东云质量部 背景 随着前端技术发展&#xff0c;已经转变为数据绑定为主流的框架方式&#xff0c;与后端服务一样&#xff0c;前端代码实现也会涉及相互依赖&#xff0c;引用这些场景&#xff0c;那么应该如何准确的评估前端代码改动的影响范围&#xff1f;…

2小时开发《点球射门游戏》,动画演示思路(上),代码已开源

唠两句 最近被疫情关在家&#xff0c;时间多运动少&#xff0c;真的很无聊呀&#xff01;也许是天意为之&#xff0c;居然来世界杯了&#xff0c;虽然这届世界杯很「冷」&#xff0c;但是多少还是为无聊的我们增加了一些无聊的趣事&#xff0c;比如勇哥在等世界杯开幕式的过程…

关于影响编码效果的画质调优总结

1、背景&#xff1a; 调试一个新项目&#xff0c;要求视频帧率为20fps、码率1.5m下&#xff0c;和竞品机对比效果。发现动态场景下的效果比竞品机差距比较明显&#xff08;做的是安防类的监控相机&#xff0c;比较关注视频的效果&#xff09;&#xff0c;比如对着运动的车流时…

红队隧道应用篇之Netsh端口转发(一)

简介 netsh是从Windows 2000开始就有的一个用于配置网络设备的命令行工具 其中netsh interface portproxy是一个配置网络代理的命令, 可以配置ipv4或ipv6的端口转发代理以及双向端口转发代理 学习隧道应用前必须了解的知识:https://blog.csdn.net/xf555er/article/details/1…

softmax回归从零开始实现

1. 引入Fashion-MNIST数据集 并设置数据迭代器的批量大小为256 import torch from IPython import display from d2l import torch as d2lbatch_size 256 # 每次随机读256张图片&#xff0c;返回训练集和测试集的迭代器 train_iter, test_iter d2l.load_data_fashion_mnist…

职场日常:测试人员如何快速熟悉新业务?

身处职场&#xff0c;学习新业务在所难免&#xff0c;尤其是测试人员&#xff0c;具备良好的业务知识是我们做好质量保障的前提&#xff0c;不管是职场「新人」还是「老人」&#xff0c;快速熟悉业务的能力都是不可或缺的&#xff0c;这是我们安身立命的根本。 但&#xff0c;…

【第一章 Linux目录结构,网络连接三种模式,vi和vim】

第一章 Linux目录结构&#xff0c;网络连接三种模式&#xff0c;vi和vim 1.Linux和Unix&#xff1a; ①Unix针对于大型&#xff0c;高性能主机或服务器&#xff1b; ②Linux适用于个人计算机。 2.网络连接的三种模式&#xff1a; ①桥接模式&#xff1a;虚拟系统可以和外部系…

[附源码]JAVA毕业设计师生交流平台(系统+LW)

[附源码]JAVA毕业设计师生交流平台&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

一起用Go做一个小游戏(上)

引子最近偶然看到一个Go语言库&#xff0c;口号喊出“一个超级简单&#xff08;dead simple&#xff09;的2D游戏引擎”&#xff0c;好奇点开了它的官网。官网上已经有很多可以在线体验的小游戏了&#xff08;利用WASM技术&#xff09;。例如曾经风靡一时的2048&#xff1a;当然…

「Redis数据结构」列表对象(List)

「Redis数据结构」列表对象&#xff08;List&#xff09; 文章目录「Redis数据结构」列表对象&#xff08;List&#xff09;一、概述二、结构三、编码转换四、总结一、概述 Redis列表是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部&#xf…