(A卷,200分)- 荒地(Java & JS & Python)

题目描述

祖国西北部有一片大片荒地,其中零星的分布着一些湖泊,保护区,矿区;
整体上常年光照良好,但是也有一些地区光照不太好。
某电力公司希望在这里建设多个光伏电站,生产清洁能源对每平方公里的土地进行了发电评估,
其中不能建设的区域发电量为0kw,可以发电的区域根据光照,地形等给出了每平方公里年发电量x千瓦。
我们希望能够找到其中集中的矩形区域建设电站,能够获得良好的收益。

输入描述

第一行输入为调研的地区长,宽,以及准备建设的电站【长宽相等,为正方形】的边长最低要求的发电量
之后每行为调研区域每平方公里的发电量

输出描述

输出为这样的区域有多少个

用例

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

输入含义:

调研的区域大小为长2宽5的矩形,我们要建设的电站的边长为2,建设电站最低发电量为6.

输出含义:

长宽为2的正方形满足发电量大于等于6的区域有4个。

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

题目解析

本题和

一模一样。题解请参考该博客。

还是有区别的,本题中有一句比较有歧义的话

其中不能建设的区域发电量为0kw

这里不能建设是什么意思?不能建设发电站吗?还是说单纯只是产出0发电量?

如果含义是不能建设发电站,那意思应该是,正方形发电站区域如果含0的话,则不能建设发电站。

如果含义是单纯发电量0,那应该没有什么影响。

下面我源码中,我对这两种情况都做了实现了。考试时,大家可以都试试。


2023.04.17

根据考友反馈,发电量为0的区域也可以建站。

基于二维矩阵前缀和的求解方法(更简单)

关于二维矩阵前缀和,请看算法设计 – 前缀和 & 差分数列_伏城之外的博客-CSDN博客

JavaScript算法源码

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

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

const lines = [];
let len, wid, sid, min;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    [len, wid, sid, min] = lines[0].split(" ").map(Number);
  }

  if (len && lines.length === len + 1) {
    const matrix = lines.slice(1).map((line) => line.split(" ").map(Number));
    console.log(getResult(len, wid, sid, min, matrix));
    lines.length = 0;
  }
});

/**
 * @param {*} r 调研区域的行数
 * @param {*} c 调研区域的列数
 * @param {*} s 正方形电站的边长
 * @param {*} min 正方形电站的最低发电量
 * @param {*} matrix 调研区域每单位面积的发电量矩阵
 */
function getResult(r, c, s, min, matrix) {
  const preSum = new Array(r + 1).fill(0).map(() => new Array(c + 1).fill(0));

  for (let i = 1; i <= r; i++) {
    for (let j = 1; j <= c; j++) {
      preSum[i][j] =
        preSum[i - 1][j] +
        preSum[i][j - 1] -
        preSum[i - 1][j - 1] +
        matrix[i - 1][j - 1];
    }
  }

  let ans = 0;

  for (let i = s; i <= r; i++) {
    for (let j = s; j <= c; j++) {
      const square =
        preSum[i][j] -
        (preSum[i - s][j] + preSum[i][j - s]) +
        preSum[i - s][j - s];

      if (square >= min) ans++;
    }
  }

  return ans;
}

Java算法源码

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int r = sc.nextInt();
    int c = sc.nextInt();

    int s = sc.nextInt();
    int min = sc.nextInt();

    int[][] matrix = new int[r][c];
    for (int i = 0; i < r; i++) {
      for (int j = 0; j < c; j++) {
        matrix[i][j] = sc.nextInt();
      }
    }

    System.out.println(getResult(matrix, r, c, s, min));
  }

  /**
   * @param matrix 调研区域每单元面积的发电量矩阵
   * @param r 调研区域的长,即行数
   * @param c 调研区域的宽,即列数
   * @param s 正方形电站的边长
   * @param min 正方形电站的最低发电量
   * @return 调研区域内有几个符合要求的正方形发电站
   */
  public static int getResult(int[][] matrix, int r, int c, int s, int min) {
    int[][] preSum = new int[r + 1][c + 1];

    for (int i = 1; i <= r; i++) {
      for (int j = 1; j <= c; j++) {
        preSum[i][j] =
            preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1] + matrix[i - 1][j - 1];
      }
    }

    int ans = 0;

    for (int i = s; i <= r; i++) {
      for (int j = s; j <= c; j++) {
        int square = preSum[i][j] - (preSum[i - s][j] + preSum[i][j - s]) + preSum[i - s][j - s];
        if (square >= min) ans++;
      }
    }

    return ans;
  }
}

Python算法源码

# 输入获取
r, c, s, minV = map(int, input().split())
matrix = [list(map(int, input().split())) for i in range(r)]


def getResult(r, c, s, minV, matrix):
    """
    :param r: 调研区域的长
    :param c: 调研区域的宽
    :param s: 正方形电站的边长
    :param minV: 正方形电站的最低发电量
    :param matrix: 调研区域每单位面积的发电量矩阵
    :return: 返回调研区域有几个符合要求正方形电站
    """

    preSum = [[0 for j in range(c + 1)] for i in range(r + 1)]

    for i in range(1, r + 1):
        for j in range(1, c + 1):
            preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1] + matrix[i - 1][j - 1]

    ans = 0

    for i in range(s, r + 1):
        for j in range(s, c + 1):
            square = preSum[i][j] - (preSum[i - s][j] + preSum[i][j - s]) + preSum[i - s][j - s]

            if square >= minV:
                ans += 1

    return ans


# 算法调用
print(getResult(r, c, s, minV, matrix))

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?