机试题——疯长的草

devtools/2024/12/25 1:29:25/

题目描述

将种不同的草随机种在一块广漠无垠的二维平面上(直角坐标系内),给定二维数组 points 表示第 0 天所有草的初始位置,第 i 项 points [i]=[xi, yi] 表第 0 天草 i 在点 [xi, yi]。每天,被草覆盖的点会向外蔓延到它上、下,左、右,左上、左下、右上、右下 8 个邻居点,注意,初始状态下,可能有多种草在同一点上。

现给定一个整数 M,问最小需要多少天,方能找到一点同时至少有 M 种草?

输入描述

第一行输入整数 M。(2<= M <= n) 第二行输入草的种数 n。(2 <= n <= 50) 后面连续 n 行输入草初始位置 [xi, yi]。(<= xi, vi <= 10^9)

输出描述

返口找到一点至少生长 M 种草的最少天数,找不到返回 0

用例输入

2
2
2 1
6 2
2

解释:在第2天,点(4,0)、(4,1)、(4,2)与(4,3)将有2种草。

2
3
2 1
6 2
100 100
2

尽管第三种草起始位置较远,但在第2天,前两种草仍可以满足条件。

解题思路

由于草的扩散是向8个方向无限扩展,且坐标范围较大(xi, yi ≤ 10^9),直接模拟草的扩散过程是不现实的。因此需要一种高效的方法来确定最小需要多少天才能满足条件。

使用二分法确定最小的天数 d,使得存在至少一个点被 M 种草覆盖。对于每种草,其在第 d 天时覆盖的区域为一个边长为 2d + 1 的正方形,中心为草的初始位置。

由于坐标范围巨大,无法在二维数组中直接标记覆盖区域。通过离散化坐标,将所有可能影响到的区域映射到一个较小的二维网格上。

还涉及到对于一个区间的查找和更新问题,对于不同的天数,在二维数组中更新不同的正方形面积,此处使用二维差分数组。

一维差分数组

差分数组定义:给定一个一维数组 A,其差分数组 D 定义为 D[i] = A[i] - A[i-1](对于 i ≥ 1)。初始化时,通常将 D 全部置零。

区间更新:要对区间 [L, R] 进行加 C 的操作,可以执行:

D[L] += C
D[R+1] -= C

还原原数组:通过计算差分数组的前缀和,可以还原出更新后的原数组

A[0] = D[0]
A[i] = A[i-1] + D[i]  for i ≥ 1

二维差分的扩展

二维差分将上述一维差分的思想扩展到二维空间,适用于处理二维平面上的区域更新与查询。

D[x][y] = A[x][y]- A[x-1][y]- A[x][y-1]+ A[x-1][y-1]

其中,A[x][y] 表示坐标 (x, y) 处的值。

区域更新:要对一个矩形区域 [x1, y1] 到 [x2, y2] 进行加 C 的操作,可以执行:

D[x1][y1] += C
D[x2+1][y1] -= C
D[x1][y2+1] -= C
D[x2+1][y2+1] += C

还原原数组:通过计算差分矩阵的二维前缀和,可以还原出更新后的二维数组:

for x from 0 to N-1:for y from 0 to M-1:if x > 0:A[x][y] += A[x-1][y]if y > 0:A[x][y] += A[x][y-1]if x > 0 and y > 0:A[x][y] -= A[x-1][y-1]A[x][y] += D[x][y]

要对一个矩形区域 [x1, y1] 到 [x2, y2] 进行加 C 的操作,可以执行以下四个更新:

增加左上角 (x1, y1):D[x1][y1] += C

减少右上角 (x1, y2 + 1):D[x1][y2 + 1] -= C

减少左下角 (x2 + 1, y1):D[x2 + 1][y1] -= C

增加右下角 (x2 + 1, y2 + 1):D[x2 + 1][y2 + 1] += C

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<vector>
#include<unordered_map>
#include<unordered_set>
#include<queue>
#include<set>
#include<list>
using namespace std;
#define MAX  200struct point {int lx, ly, rx, ry;
};vector<point> g(MAX);
int m, n;
int mp[MAX][MAX];
int x[MAX], y[MAX];
bool check(int d) {memset(mp, 0, sizeof(mp)); //必须初始化map<int, int> cx, cy;// x的边界 y的边界// 差分是左闭右闭for (int i = 0; i < n; i++) {// 覆盖的矩阵区间g[i] = { x[i] - d,y[i] - d,x[i] + d,y[i] + d };//先标识差分数组的坐标cx[g[i].lx]=0;cx[g[i].rx+1]=0;cy[g[i].ly]=0;cy[g[i].ry+1]=0;}// map 自动排序好了 直接离散坐标编号int xx = 0, yy = 0;for (auto& t : cx) t.second = ++xx;for (auto& t : cy) t.second = ++yy;// 开始针对离散坐标构建差分数组for (int i = 0; i < n; i++) {int lx = cx[g[i].lx];int rx = cx[g[i].rx + 1];int ly = cy[g[i].ly];int ry = cy[g[i].ry + 1];/*(lx,ly)    (lx,ry)(rx,ly)    (rx,ry)*/mp[lx][ly]++;mp[lx][ry]--;mp[rx][ly]--;mp[rx][ry]++;}// 对离散坐标进行计算for (int i = 1; i <=xx; i++) {for (int j = 1; j <=yy; j++) {mp[i][j] += mp[i - 1][j] + mp[i][j - 1] - mp[i - 1][j - 1];//cout << i << " " << j<<"  " << mp[i][j] << endl;if (mp[i][j] >= m) return true;}}return false;
}
int main()
{ios::sync_with_stdio(false); cin.tie(nullptr);  cin >> m >> n;for (int i = 0; i < n; i++) {cin >> x[i] >> y[i];}int l = 0, r = 10e9;while (l < r) {int mid = (l + r) / 2;if (check(mid)) r = mid;else l = mid + 1;}cout << l << endl;
}

http://www.ppmy.cn/devtools/145128.html

相关文章

Day13 用Excel表体验梯度下降法

Day13 用Excel表体验梯度下降法 用所学公式创建Excel表 用Excel表体验梯度下降法 详见本Day文章顶部附带资源里的Excel表《梯度下降法》&#xff0c;可以对照表里的单元格公式进行理解&#xff0c;还可以多尝试几次不同的学习率 η \eta η来感受&#xff0c;只需要更改学习率…

【openwrt】openwrt NAT64 NAT46实现简介

NAT64 & NAT46 在 OpenWrt 上实现 NAT46 和 NAT64 可以通过安装和配置相应的软件包来完成。 NAT64 实现步骤 安装必要的软件包 你需要安装 tayga 和 bind 或 dnsmasq 以支持 NAT64 和 DNS64。 使用以下命令安装: opkg update opkg install tayga opkg install bind-s…

【系统移植】NFS服务器环境搭建——挂载根文件系统

什么是NFS&#xff1f; NFS&#xff08;Network File System&#xff09;即网络文件系统&#xff0c;其基于UDP/IP 使用NFS能够在不同计算机之间通过网络进行文件共享&#xff0c;能使使用者访问网络上其它计算机中的文件就像在访问自己的计算机一样&#xff0c;文件只存在于服…

# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)

↑ 上方下载文档 (大小374KB) 接口文档预览 (超过50个接口) 一、数据库25张表er-关系清晰构图&#xff01;(tip: 鼠标右键图片 > 放大图像) 二、难点/经验 详细说明 热门评论排序评论点赞列表|DTO封装经验分享|精华接口文档说明 组员都说喜欢分档对应枚举码 如果这篇文章…

黑客术语3

19、免杀 : 就是通过加壳、加密、修改特征码、加花指令等等技术来修改程序&#xff0c; 使其逃过杀毒软件的查杀。 20 、加壳 : 就是利用特殊的算法&#xff0c;将 EXE 可执行程序或者 DLL 动态连接库文件的 编码进行改变&#xff08;比如实现压缩、加密&#xff09;&a…

Jenkins 持续集成部署——Jenkins实战与运维(1)

一、Jenkins 相关配置及代码发布 1. Jenkins 发布 php 代码 1.1 安装插件 先进入“系统管理”&#xff0c;再进入“管理插件”&#xff0c;在“已安装”中检查是否有“Git plugin”和“Publish Over SSH”两个插件&#xff0c;如果没有则需要安装&#xff0c;到“可选插件”中…

解释工厂模式

参考文献&#xff1a;C几种工厂模式和实现实例_工厂方法模式c实例-CSDN博客 什么是工厂模式 工厂模式是一种创建对象的设计模式&#xff0c;它提供了一种创建对象的方式&#xff0c;将对象的创建和使用分离 通过工厂模式&#xff0c;可以根据不同的条件创建不同类型的对象&a…

【模型压缩】原理及实例

在移动智能终端品类越发多样的时代&#xff0c;为了让模型可以顺利部署在算力和存储空间都受限的移动终端&#xff0c;对模型进行压缩尤为重要。模型压缩&#xff08;model compression&#xff09;可以降低神经网络参数量&#xff0c;减少延迟时间&#xff0c;从而实现提高神经…