【CSP:202104-2】邻域均值(Java)

题目链接

题目描述





求解思路

  • 二维前缀和:用s数组记录下二维数组a的前缀和。在进行查询时直接利用前缀和求平均值,可以降低时间复杂度。

  • xl表示邻域的左边界,xr表示邻域的右边界,yt表示邻域的上边界,yb表示邻域的下边界。

  • 为什么要用double类型进行比较?因为涉及除法,如果用整形的话可能会出现误差。

实现代码

java 复制代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int L = in.nextInt();
        int r = in.nextInt();
        double t = in.nextDouble();
        int[][] a = new int[n + 1][n + 1];
        int[][] s = new int[n + 1][n + 1];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                a[i][j] = in.nextInt();
                s[i][j] = s[i - 1][j] + s[i][j - 1] + a[i][j] - s[i - 1][j - 1];
            }
        }
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                int xl = Math.max(j - r, 1);
                int xr = Math.min(j + r, n);
                int yt = Math.max(i - r, 1);
                int yb = Math.min(i + r, n);
                double avg = (double) (s[yb][xr] - s[yb][xl - 1] - s[yt - 1][xr] + s[yt - 1][xl - 1]) /
                        ((yb - yt + 1) * (xr - xl + 1));
                if (avg <= t) {
                    cnt ++;
                }
            }
        }
        System.out.println(cnt);
    }
}
相关推荐
青少儿编程课堂7 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
YSL07012437 分钟前
一文通关-----排序
数据结构·算法
天河归来10 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL10 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
ZhengEnCi11 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考11 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
砚底藏山河12 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
猿究院_夏燊12 小时前
MySQL 的四种隔离级别
java·数据库·mysql
码流子13 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
霸道流氓气质13 小时前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring