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【模拟+二分】的更多相关文章

  1. Gym 102091L Largest Allowed Area 【二分+二维前缀和】

    <题目链接> 题目大意:给你一个由01组成的矩形,现在问你,该矩形中,最多只含一个1的正方形的边长最长是多少. 解题分析: 用二维前缀和维护一下矩形的01值,便于后面直接$O(1)$查询任 ...

  2. Largest Rectangular Area in a Histogram

    题目地址:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/ ,刚開始事实上没做这个题,而是在做https://oj.le ...

  3. Largest Rectangular Area in a Histogram 最大连续面积

    在HankerRank遇到一题计算柱状图连续矩形面积的问题. 举例 hist = [3, 2, 3]. 在这个柱状图里面最大可以容纳一个high = 2 length = 3的连续矩形, 其面积 = ...

  4. 【Leetcode_easy】812. Largest Triangle Area

    problem 812. Largest Triangle Area solution: class Solution { public: double largestTriangleArea(vec ...

  5. FZU 1575 小学生的游戏【模拟二分】

    某天,无聊的小斌叫上几个同学玩游戏,其中有比较笨的小兴,比较傻的小雪,可爱的小霞和自以为是的小楠.他们去找聪明的小明去给他们当裁判.判定谁取得游戏胜利. 而这个游戏是由小斌想个1到10000000的数 ...

  6. Hdu3640-I, zombie(模拟+二分)

    The "endless" model in "I, zombie" of "Plants vs. Zombies" is my favou ...

  7. [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 ...

  8. [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 ...

  9. 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 ...

随机推荐

  1. Deno会在短期内取代Node吗?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/what-is-deno-and-will-it-r ...

  2. 27-1 分组-having

    group by select * from TblStudent --1.请从学生表中查询出每个班的班级id和班级人数 select tsclassId as 班级id, 班级人数=count(*) ...

  3. Understanding REST and RESTful APIs

    Understanding REST and RESTful APIs If you've spent any amount of time with modern web development, ...

  4. Vue混入的详解

    简介     混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项.钩子函数合并 ...

  5. git简单的使用步骤

    Git介绍 Git是分布式版本控制系统 集中式VS分布式,SVN VS Git 1)SVN和Git主要的区别在于历史版本维护的位置 2)这两个工具主要的区别在于历史版本维护的位置Git本地仓库包含代码 ...

  6. 读Pyqt4教程,带你入门Pyqt4 _009

    QLineEdit QLineEdit 窗口组件用来输入或者编辑单行纯文本,有撤销/重做,剪切/粘贴和拖放功能. #!/usr/bin/python # -*- coding: utf-8 -*- # ...

  7. pandas手册

    https://www.dataquest.io/blog/large_files/pandas-cheat-sheet.pdf

  8. PYTHON 黑帽子第二章总结

    基于python3编写 import sys, socket, getopt, threading, argparse, subprocess # globals options listen = F ...

  9. SpringBoot 2.x 版本以put方式提交表单不生效的问题详解

    在使用SpringBoot 2.x版本时,原有springboot 1.x 版本的通过在表单中添加 input框隐藏域指定_method = put 的方式失效. 虽然浏览器传参的确是带上了这个参数, ...

  10. Spring AMQP:RabbitTemplate SimpleMessageListenerContainer

    一.RabbitTemplate介绍 RabbitTemplate:消息模板,在与Spring AMQP整合时,进行发送消息的关键类. 包括了可靠性投递消息方法.回调监听消息接口ConfirmCall ...