Largest Allowed Area【模拟+二分】
Largest Allowed Area
题目描述
A company is looking for land to build its headquarters. It has a lot of money and can buy as many land patches as it needs. Its goal, however, is finding the largest square region containing no forest. Unfortunately, there is no such region that is large enough for the headquarters they want to build.
After negotiation with the government and the evaluation of environmental impacts, the government allows the company to purchase land with at most one forest patch. In other words, the company’s goal is now finding the largest square region containing at most one forest patch.
To facilitate the search process, the company creates a map in the form of a 2D table consisting R rows and C columns. In this 2D table, each entry represents a land of patch where 0 corresponds to a non-forest patch and 1 to a forest patch. Unfortunately, the map may have up to 1,000 x 1,000 entries and it is not a good idea to manually look for the largest allowed square region. This is where your skill comes into play. Write an efficient algorithm to find such a square region.
输入
The first line is a positive integer T <= 20 representing the number of test cases. For each case, the input is formatted as follows.
Note: there is at least one non-forest patch in each test case.
样例输入
2
10 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20 10
1 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
样例输出
9
7
输出
There are T lines in the output. Each line is the number of rows in the largest allowed square region for each case.
题意:
给出n*m的矩阵 其中只包含0和1 要求在里面找出 边长最大的正方形 最多可以使用1个1
思路:
学长的思路 感觉很好
首先根据输入打好一张表:任意坐标位置 其左上部分包含该点上方和左方 全部点 1的总个数
例如示例1 打好表如下:

先枚举出 目标矩阵的边长 1 ~ min (n,m)
然后再用两层for循环 枚举x和y表示 矩阵左上角放置的位置 如果符合条件(即正方形内部1的个数<=1即可)直接跳出循环
因为枚举的边长是从大到小的 所以首先找到的一定是符合条件即最大的 代码如下:但T了
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e3;
int a[MAX+5][MAX+5],b[MAX+5][MAX+5];
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
b[i][j]=b[i][j-1]+b[i-1][j]-b[i-1][j-1]+a[i][j];
}
}
/*
printf("\n\n");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
*/
int flag=0,flag1=0,ans=0;
for(int k=min(n,m);k>=0;k--){
//printf("%d ",k);
for(int i=0;i+k<n;i++){
for(int j=0;j+k<m;j++){
if(b[i][j]+b[i+k-1][j+k-1]-b[i-1][j+k-1]-b[i+k-1][j-1]<=1){
ans=k;
flag=1;
break;
}
}
if(flag==1){
flag1=1;
break;
}
}
if(flag1==1){
break;
}
}
printf("%d\n",ans);
}
return 0;
}
优化:
通过二分枚举的正方形边长方法降低复杂度 因为 当mid符合条件的时候 mid+1 ~ min(n,m) 也可能符合条件 反之 1 ~ mid-1 也可能是符合条件的
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e3;
int a[MAX+5][MAX+5],b[MAX+5][MAX+5];
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
b[i][j]=b[i][j-1]+b[i-1][j]-b[i-1][j-1]+a[i][j];
}
}
int ans=0;
if(b[n-1][m-1]!=n*m){
int l=0,r=min(n-1,m-1);
while(l<=r){
int k=(l+r)/2,flag=0,flag1=0;
for(int i=0;i+k-1<n;i++){
for(int j=0;j+k-1<m;j++){
if(b[i-1][j-1]+b[i+k-1][j+k-1]-b[i-1][j+k-1]-b[i+k-1][j-1]<=1){
ans=k;
flag=1;
break;
}
}
if(flag==1){
flag1=1;
break;
}
}
if(flag1==1){
l=k+1;
}
else{
r=k-1;
}
}
}
printf("%d\n",ans);
}
return 0;
}
Largest Allowed Area【模拟+二分】的更多相关文章
- Gym 102091L Largest Allowed Area 【二分+二维前缀和】
<题目链接> 题目大意:给你一个由01组成的矩形,现在问你,该矩形中,最多只含一个1的正方形的边长最长是多少. 解题分析: 用二维前缀和维护一下矩形的01值,便于后面直接$O(1)$查询任 ...
- Largest Rectangular Area in a Histogram
题目地址:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/ ,刚開始事实上没做这个题,而是在做https://oj.le ...
- Largest Rectangular Area in a Histogram 最大连续面积
在HankerRank遇到一题计算柱状图连续矩形面积的问题. 举例 hist = [3, 2, 3]. 在这个柱状图里面最大可以容纳一个high = 2 length = 3的连续矩形, 其面积 = ...
- 【Leetcode_easy】812. Largest Triangle Area
problem 812. Largest Triangle Area solution: class Solution { public: double largestTriangleArea(vec ...
- FZU 1575 小学生的游戏【模拟二分】
某天,无聊的小斌叫上几个同学玩游戏,其中有比较笨的小兴,比较傻的小雪,可爱的小霞和自以为是的小楠.他们去找聪明的小明去给他们当裁判.判定谁取得游戏胜利. 而这个游戏是由小斌想个1到10000000的数 ...
- Hdu3640-I, zombie(模拟+二分)
The "endless" model in "I, zombie" of "Plants vs. Zombies" is my favou ...
- [Swift]LeetCode812. 最大三角形面积 | Largest Triangle Area
You have a list of points in the plane. Return the area of the largest triangle that can be formed b ...
- [LeetCode] Largest Triangle Area 最大的三角区域
You have a list of points in the plane. Return the area of the largest triangle that can be formed b ...
- LeetCode 812 Largest Triangle Area 解题报告
题目要求 You have a list of points in the plane. Return the area of the largest triangle that can be for ...
随机推荐
- Web-Security-Learning
Web Security sql注入 MySql MySQL False 注入及技巧总结 MySQL 注入攻击与防御 sql注入学习总结 SQL注入防御与绕过的几种姿势 MySQL偏门技巧 mysql ...
- Java并发编程volatile关键字
volatile理解 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和volatile 关键字机制.volatile具有synchronized关键字的“可见性”,vo ...
- 关于 conda中的 lxml 无法导入 etree 问题
找到你conda的安装目录下\Lib\site-packages下的两个文件夹lxml和lxml-4.3.4.dist-info,将这两个文件夹删除. 执行命令pip install lxml 重新安 ...
- 【Windows】win10:硬件良好,软件系统出错
平台:戴尔G3, win10 现象:能正常开机,开机后前几分钟内能打开部分应用,经过大约两分钟后系统无法正常使用. 分析:此次问题出现再新购买的笔记本电脑中,鉴于电脑刚买,硬件坏的可能性很小,然而为了 ...
- [JavaWeb基础] 006.Struts1的配置和简单使用
1.框架简介 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架,用于快速开发Java Web应用.Struts实现的重点在C(Controller), ...
- 最小生成树——Prim算法理解
背景:本文是在小甲鱼数据结构教学视频中的代码的基础上,添加详细注释而完成的.该段代码并不完整,仅摘录了核心算法部分,结合自己的思考,谈谈理解. Prim算法理解: 如图(摘录自小甲鱼教学视频中的图片) ...
- Asp.Net Mvc基于Fleck开发的多人网页版即时聊天室
一.项目的核心说明 1.Fleck这个是实现websocket一个比较简单第三方组件,它不需要安装额外的容器.本身也就几个接口可供调用. 2.项目是基于.net framework 4.7.2 ,在v ...
- 关于自己配置有关webpack.config.js和vue项目搭建相关步骤
## Webpack的配置和使用 ### 安装 1. 全局安装 ``` npm install webpack -g ``` 2. 本地安装 ``` npm install webpack -D `` ...
- (Java实现) 洛谷 P1071 潜伏者
题目描述 R国和 S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S国的 R 国间谍小 C终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原信息经过 ...
- Java实现 蓝桥杯 算法训练 天数计算
试题 算法训练 天数计算 问题描述 编写函数求某年某月某日(**** ** **)是这一年的第几天 .提示:要考虑闰年,闰年的2月是29天(闰年的条件:是4的倍数但不是100的倍数,或者是400的倍数 ...