Corral the Cows

news/2025/9/24 17:48:19/文章来源:https://www.cnblogs.com/zznu/p/19109685

点评:我认为是一道很不错的题,将很多基础的算法融汇到一起。

题目链接:https://vjudge.net/problem/POJ-3179#author=GPT_zh

题目描述:农夫约翰希望为他的奶牛建造一个围栏。由于奶牛是挑剔的动物,它们要求围栏是正方形的,并且围栏内至少要有 C (1 <= C <= 500) 块三叶草田作为下午的美味佳肴。围栏的边缘必须与 X,Y 轴平行。

FJ 的土地上总共有 N (C <= N <= 500) 块三叶草田,每块的大小为 1 x 1,且其左下角的坐标为整数 X 和 Y,范围在 1..10,000。有时,多个三叶草田会生长在同一位置;这样的田地在输入中会出现两次(或更多次)。如果一块三叶草田完全位于围栏的边界内,则该围栏将围绕该三叶草田。
请帮助 FJ 告诉他包含 C 块三叶草田的最小正方形的边长。

因为这道题涉及的问题很多,所以接下来我们逐步进行分析

离散化引入:
很多人拿到这道题的时候肯定第一想法是二维前缀和。然后再枚举正方形。我当时也是这么想的,因为我刚拿到这道题的时候错把N当作图的大小。每次只需要选定一个起始点然后遍历这个点所在斜线利用双指针求解。
代码如下

点击查看代码
for (int i = 1; i <= 500; i++){lowx = 1;lowy = i;highx = 1;highy = i;while (highx <= 500 && highy <= 500){if (map1[highx][highy] - map1[highx][lowy - 1] - map1[lowx - 1][highy] + map1[lowx - 1][lowy - 1] < n){highx++;highy++;continue;}ans = min(ans, highx - lowx + 1);if (map1[highx][highy] - map1[highx][lowy - 1] - map1[lowx - 1][highy] + map1[lowx - 1][lowy - 1] >= n){lowx++;lowy++;}}}for (int i = 1; i <= 500; i++){lowx = i;lowy = 1;highx = i;highy = 1;while (highx <= 500 && highy <= 500){if (map1[highx][highy] - map1[highx][lowy - 1] - map1[lowx - 1][highy] + map1[lowx - 1][lowy - 1] < n){highx++;highy++;continue;}ans = min(ans, highx - lowx + 1);if (map1[highx][highy] - map1[highx][lowy - 1] - map1[lowx - 1][highy] + map1[lowx - 1][lowy - 1] >= n){lowx++;lowy++;}}}
以上代码时间复杂度为O(max(x,y)^2)只适用于规模x和y的最大值较小的题。

对于这道题来说我们发现给出的点的数量很少但是点之间的跨度又很大,所以我们可以将点给离散化。
代码如下

点击查看代码
cin >> n >> m;vector<int> judgex(10050);vector<int> judgey(10050);vector<int> nx;vector<int> ny;nx.push_back(0);ny.push_back(0);vector<pll> arr(m + 5);for (int i = 1; i <= m; i++){cin >> arr[i].first >> arr[i].second;if (!judgex[arr[i].first]){judgex[arr[i].first] = 1;nx.push_back(arr[i].first);}if (!judgey[arr[i].second]){judgey[arr[i].second] = 1;ny.push_back(arr[i].second);}}vector<vector<int> > arr1(nx.size() + 5, vector<int>(ny.size() + 5));vector<vector<int> > map1(nx.size() + 5, vector<int>(ny.size() + 5));sort(nx.begin() + 1, nx.end());sort(ny.begin() + 1, ny.end());int maxx = max(nx[nx.size() - 1] - nx[1], ny[ny.size() - 1] - ny[1]) + 5;for (int i = 1; i <= m; i++){int x = lower_bound(nx.begin() + 1, nx.end(), arr[i].first) - nx.begin();int y = lower_bound(ny.begin() + 1, ny.end(), arr[i].second) - ny.begin();arr1[x][y]++;}

使用二维前缀和处理二维数组

点击查看代码
for (int i = 1; i < nx.size(); i++){for (int j = 1; j <= ny.size(); j++){map1[i][j] = map1[i - 1][j] + map1[i][j - 1] + arr1[i][j] - map1[i - 1][j - 1];}}

二分答案
因为我们对点进行了离散,对于数组位置(i,j)来说(i+k,j+k)之间可能已经不能组成正方形,所以我们可以选定正方形的起始点和二分答案得到正方形的边长来进行判断该组合是否满足要求。

这里附上完整代码。

点击查看代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>using namespace std;
typedef pair<int, int> pll;int n, m;
bool check(int s, vector<vector<int> > &map, vector<int> &nx, vector<int> &ny)
{for (int i = 1; i < nx.size(); i++){for (int j = 1; j < ny.size(); j++){int x1 = upper_bound(nx.begin() + 1, nx.end(), nx[i] + s - 1) - nx.begin();int y1 = upper_bound(ny.begin() + 1, ny.end(), ny[j] + s - 1) - ny.begin();if (nx[x1] != nx[i] + s - 1)x1--;if (ny[x1] != ny[i] + s - 1)y1--;if (map[x1][y1] - map[x1][j - 1] - map[i - 1][y1] + map[i - 1][j - 1] >= n)return true;}}return false;
}
int binary(int high, vector<vector<int> > &map, vector<int> &nx, vector<int> &ny)
{int low = 0;while (low + 1 != high){int mid = (low + high) / 2;bool ret = check(mid, map, nx, ny);if (ret == true)high = mid;elselow = mid;}return high;
}
void solve()
{cin >> n >> m;vector<int> judgex(10050);vector<int> judgey(10050);vector<int> nx;vector<int> ny;nx.push_back(0);ny.push_back(0);vector<pll> arr(m + 5);for (int i = 1; i <= m; i++){cin >> arr[i].first >> arr[i].second;if (!judgex[arr[i].first]){judgex[arr[i].first] = 1;nx.push_back(arr[i].first);}if (!judgey[arr[i].second]){judgey[arr[i].second] = 1;ny.push_back(arr[i].second);}}vector<vector<int> > arr1(nx.size() + 5, vector<int>(ny.size() + 5));vector<vector<int> > map1(nx.size() + 5, vector<int>(ny.size() + 5));sort(nx.begin() + 1, nx.end());sort(ny.begin() + 1, ny.end());int maxx = max(nx[nx.size() - 1] - nx[1], ny[ny.size() - 1] - ny[1]) + 5;for (int i = 1; i <= m; i++){int x = lower_bound(nx.begin() + 1, nx.end(), arr[i].first) - nx.begin();int y = lower_bound(ny.begin() + 1, ny.end(), arr[i].second) - ny.begin();arr1[x][y]++;}for (int i = 1; i < nx.size(); i++){for (int j = 1; j <= ny.size(); j++){map1[i][j] = map1[i - 1][j] + map1[i][j - 1] + arr1[i][j] - map1[i - 1][j - 1];}}cout << binary(maxx, map1, nx, ny) << endl;
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);int t = 1;// cin >> t;while (t--){solve();}return 0;
}

对二分答案进行说明,当我们分到变成K时我们只需要遍历整个二维数组选择起始点,根据K我们可以得到在这个正方形内满足条件的位置在如果该正方形内的草田的数量>=我们想要的数量时,说明K有可能可以缩小,如果对于二维数组的任何位置都不满足条件的话,就是K的值太小

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

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

相关文章

个人网站开发 怎么赚钱tp5被黑做的网站全变成首页

中秋小长假“余额”就剩半天了尽管心里有太多不舍也要调整自己毕竟假期都是短暂的工作才是职场人生的常态为了尽快消除“假日综合症”e小安贴心送上小文一篇小伙伴们赶紧“脉动”回来吧各类web应用充斥在我们的网络生活中&#xff0c;但是因为开发者安全意识不强而导致的安全问…

HarmonyOS 5 通知与语音能力开发实战:从消息推送到智能语音交互

一、通知系统开发全面解析 1. 通知权限与基础配置 在 module.json5中声明通知和语音相关权限: {"module": {"requestPermissions": [{"name": "ohos.permission.NOTIFICATION_CON…

Keithley 万用表里测电阻分成两种模式

Keithley 万用表里测电阻分成两种模式前面板操作(以常见型号为例)开机,确认表正常自检通过。在 功能选择区(Function/Measure 按键区):找到 Ω(Ohms / RES) 按键,按下后进入电阻测量模式。如果你的型号没有单…

HarmonyOS 5 Native与ArkTS混合开发实战:跨语言高性能组件开发

一、混合开发架构与原理 1. 混合开发核心架构 HarmonyOS混合开发采用分层设计:ArkTS层:UI组件和业务逻辑,使用声明式开发范式 Node-API桥接层:提供类型安全的跨语言通信机制 Native层:C/C++高性能计算和系统级功能…

实战:基于HarmonyOS 5构建分布式聊天通讯应用

1 HarmonyOS 5分布式通信基础 HarmonyOS 5为聊天通讯应用开发带来了革命性的分布式能力,让开发者能够构建真正跨设备、无缝协同的通信体验。本节将介绍如何利用HarmonyOS 5的分布式架构和API 12+特性来打造高性能聊天…

Java-Eclipse使用-多维数组的使用

Java-Eclipse使用-多维数组的使用Day08 1.多维数组的打印方式 2.多维数组的实操使用 3.多维数组的实操使用 4.多维数组的实操使用 明天会继续进行更新,二维数组的打印不太理解。

中国建设银行官方网站 认证网站运营和seo的区别

大家想必都知道&#xff0c;数组和链表的搜索操作的时间复杂度都是O(N)的&#xff0c;在数据量大的时候是非常耗时的。对于数组来说&#xff0c;我们可以先排序&#xff0c;然后使用二分搜索&#xff0c;就能够将时间复杂度降低到O(logN)&#xff0c;但是有序数组的插入是一个O…

HarmonyOS 5 动画开发实战:从基础动效到高级交互动画

🎯 一、HarmonyOS动画系统概述 HarmonyOS提供了强大而灵活的动画系统,支持多种动画类型和交互效果:动画类型 适用场景 核心API属性动画 组件尺寸、位置、透明度等属性变化 animateTo(), Animation()转场动画 组件出…

HarmonyOS 5 高级动效实战:粒子系统、路径动画与物理动效开发

一、粒子系统动画开发 粒子动画通过大量微小元素的运动创造复杂视觉效果,如雨雪、火焰、爆炸等自然现象。 1. 基础粒子系统实现 import particle from @ohos.graphics.particle; import { BusinessError } from @ohos…

从范德蒙德矩阵聊开去.

范德蒙德矩阵 : \(\bm{V}=\left[ \begin{array}{ccc}1 & x_0 & x_0^2 & \cdots & x_0^{n-1} \\1 & x_1 & x_1^2 & \cdots & x_1^{n-1} \\1 & x_2 & x_2^2 & \cdots &…

全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!

全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!在生成式 AI 的浪潮下,计算资源,尤其是支撑所有服务运行与调度的 CPU 资源,已经从单纯的成本项目,升级为驱动创新速度与竞争力的底层基石。…

HarmonyOS 5 动画性能优化深度解析:从原理到实践

一、HarmonyOS动画系统架构与渲染原理 1. 动画系统核心架构 HarmonyOS的动画系统采用分层设计,包含三个关键层级:UI组件层:基于ArkUI的声明式动画API(如animateTo) 动画引擎层:负责插值计算和时间轴管理 渲染管线…

容桂网站制作公司系统类小说

类ReentrantLock具有完全互斥排他的效果&#xff0c;即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性&#xff0c;但是效率低下。JDK提供了ReentrantReadWriteLock读写锁&#xff0c;使用它可以加快效率&#xff0c;在某些不需要操作…

vue3 + antd +ts cron 选择器使用

https://github.com/shiyzhang/shiyzhang-cron shiyzhang-cron组件 使用方法:npm i shiyzhangcron 或 pnpm i shiyzhangcron 给ts添加类型声明文件在项目根目录下创建 types 文件夹 在 types 文件夹中创建 shiyzhangc…

HarmonyOS 5 性能优化全攻略:从启动加速到内存管理

🚀 一、启动速度优化 应用启动是用户体验的第一印象,优化启动速度至关重要。 1. 冷启动时延优化 通过精简初始化流程和资源预加载,可将启动时间缩短30%-50%。 // LaunchOptimization.ets import TaskPool from @oh…

#字符串执行函数——eval()、exec()和compile()详解

字符串执行函数——eval()、exec()和compile()详解 字符串类型代码的执行函数有三个,都是Python的内置函数。 eval() 执行字符串类型的代码,并返回最终结果。 exec() 执行字符串类型的代码。 #### compile() 将字符…

HarmonyOS 5 网络编程与数据存储实战:从RESTful API到本地持久化

🌐 一、网络编程基础与权限配置 HarmonyOS提供了强大的网络能力,支持HTTP/HTTPS、WebSocket、Socket等协议。 1. 权限声明与配置 在 module.json5中声明网络权限和加密通信权限: {"module": {"requ…

视觉传达设计网站深圳 德 网站建设

主要内容 自定义函数式接口函数式编程常用函数式接口 第一章 函数式接口 概念 函数式接口在java中指的是:有且只有一个抽象方法的接口 函数式接口,即适用于函数式编程场景的接口.而java中共的函数式编程体现就是Lambda,所以函数式接口就是可以适用于lambda使用的接口.只有…

OceanBase 向量数据库使用指南

OceanBase 向量数据库使用指南为了大家更好地使用 OceanBase 向量数据库, OceanBase 中负责研发向量能力的一众研发同学共同为大家写了这篇《OceanBase 向量数据库使用指南》,推荐各位老师收藏本文,以备不时之需。A…

【光照】[环境光ambient]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达环境光的基本处理流程 $Cambient$‌环境光采集‌:获取场景环境光照信息 ‌环境光遮蔽‌:计算环境光遮挡关系 ‌环境光反射‌:根据材质属性反射环境光 ‌环境光混合‌:与其…