最大矩形面积

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

在一个矩形区域内有很多点,每个点的坐标都是整数。求一个矩形,使之内部没有点,且面积最大。所求矩形的边与坐标轴平行。

Input

一个整数t,表示测试组数。

整数l,w表示矩形横向边长和竖向边长。

一个整数n,表示该矩形内点的个数。

n个点的坐标x,y。

Output

最大面积。

Sample Input

2

2 3

0

10 10

4

1 1

9 1

1 9

9 9

Sample Output

6

80

题解:这道题是一道偏向思维的题目,先让点从左往右跑一边然后从上往下跑一边找出最大的矩形面积。注意边界的更新,需要让这个点再边界内部,一开始 我想的是根据面积最小的损失来更新这个点,结果后来意识到,比如一个点的x坐标7,此时的左右边界的值跟新为(0,6),这个点就不再范围内了,这样就导致该点不再所求的矩形的边上,然而循环求的意义在于求与这个点有关的矩形的面积(点在矩形边上)。

import java.util.*;

public class Main {
public static void main(String []args)
{
Scanner cin = new Scanner(System.in);
int t,i,lr,ud;
node a = new node();
t = cin.nextInt();
while(t-->0)
{
a.l = cin.nextInt();
a.w = cin.nextInt();
a.n = cin.nextInt();
a.INIT();
//System.out.println(a.n);
for(i=2;i<a.n;i++)
{
a.s[i].x = cin.nextInt();
a.s[i].y = cin.nextInt();
}
lr = a.get_lr();
ud = a.get_ud();
System.out.println(Math.max(lr, ud));
}
cin.close();
}
} class point
{
int x,y;
}
/*具体的解题代码*/
class node
{
int l,w,n;
point s[] = new point[1050];
/*初始化,让边界成为一个点(最大的矩形面积)*/
void INIT()
{
int i;
n = n + 2;
for(i=0;i<n;i++)
s[i] = new point();
s[0].x = 0;
s[0].y = 0;
s[1].x = l;
s[1].y = w;
}
/*根据x的大小对点进行排序*/
void sortlr()
{
int i,j;
point t = new point();
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(s[j].x>s[j+1].x)
{
t = s[j];
s[j] = s[j+1];
s[j+1] = t;
}
else if(s[j].x==s[j+1].x)
{
if(s[j].y>s[j+1].y)
{
t = s[j];
s[j] = s[j+1];
s[j+1] = t;
}
}
}
}
}
/*根据y的大小对点进行排序*/
void sortud()
{
int i,j;
point t = new point();
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(s[j].y>s[j+1].y)
{
t = s[j];
s[j] = s[j+1];
s[j+1] = t;
}
else if(s[j].y==s[j+1].y)
{
if(s[j].x>s[j+1].x)
{
t = s[j];
s[j] = s[j+1];
s[j+1] = t;
}
}
}
}
}
/*从左往右寻找最大的矩形面积*/
int get_lr()
{
int ans = 0,i,j,du,dd;
sortlr();
for(i=0;i<n-1;i++)
{
du = w;
dd = 0;
for(j=i+1;j<n;j++)
{
if(s[i].x!=s[j].x)
{
ans = Math.max(ans, (s[j].x-s[i].x)*(du-dd));
/*更新上下边界,注意让此时的点在边界范围内(即该点在矩形的边上)*/
if(s[j].y>s[i].y)
du = Math.min(du, s[j].y);
else
dd = Math.max(dd,s[j].y);
}
}
}
return ans;
}
/*从下往上找最大的矩形面积*/
int get_ud()
{
int ans = 0,i,j,dl,dr;
sortud();
for(i=0;i<n-1;i++)
{
dl = 0;
dr = l;
for(j=i+1;j<n;j++)
{
if(s[i].y!=s[j].y)
{
ans = Math.max(ans, (s[j].y-s[i].y)*(dr-dl));
/*更新上下边界*/
if(s[j].x>s[i].x)
dr = Math.min(dr, s[j].x);
else
dl = Math.max(dl, s[j].x);
}
}
}
return ans;
}
}

Java练习 SDUT-2401最大矩形面积的更多相关文章

  1. Java实现 蓝桥杯VIP基础练习 矩形面积交

    描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入 输入仅包含两行,每行描述一个矩形. 在每行中,给出矩 ...

  2. 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

    package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...

  3. Java实现 LeetCode 223 矩形面积

    223. 矩形面积 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积. 每个矩形由其左下顶点和右上顶点坐标表示,如图所示. Rectangle Area 示例: 输入: -3, 0, 3, 4 ...

  4. 2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)

    矩形面积 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. HDU 3265 扫描线(矩形面积并变形)

    Posters Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. Largest Rectangle in a Histogram(最大矩形面积,动态规划思想)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  7. HDU1542 扫描线(矩形面积并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板

    好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解.现在来水一水博客,写一下若干年前的题目的题解. Atlantis Time Limit: 2000/1000 MS (Java/Ot ...

随机推荐

  1. 2019-8-31-dotnet-如何调试某个文件是哪个代码创建

    title author date CreateTime categories dotnet 如何调试某个文件是哪个代码创建 lindexi 2019-08-31 16:55:58 +0800 201 ...

  2. Docker(五)安装Fastdfs

    https://blog.csdn.net/qq_37759106/article/details/82981023 有2个提示: 这篇博客nginx开放的80端口, 首先要打开防火墙80的端口: 测 ...

  3. stream分组

    1.根据集合元素中的一个属性值分组 Person p1 = new Person("张三", new BigDecimal("10.0"));Person p2 ...

  4. 20190813-Sunburst

    Sunburst-7obu&Itro 雨过天晴. 考试过程 刚开始挺郁闷的,上一个T2还在改(50/50/51)XD 先通看三题. T1好像是树?? T2可以把环拆成链. T3好像是BFS?? ...

  5. javascript go()函数

    <a href="javascript:history.go(-1);">返回上一页</a> put this in your input tag < ...

  6. ckfinder提示从服务器读取XML数据出错

    在web.xml中加入以下配置,具体路径根据工程配置写 <!-- ckfinder --> <servlet> <servlet-name>ConnectorSer ...

  7. java.lang.ClassCastException: java.io.ByteArrayInputStream cannot be cast to java.io.FileInputStream

    今天在做文件上传的时候遇到一个这样的问题 java.lang.ClassCastException: java.io.ByteArrayInputStream cannot be cast to ja ...

  8. vue+vant ui+高德地图的选址组件

    首先在index.html引入高德地图的js <script src="https://webapi.amap.com/maps?v=1.4.14&key=你的key" ...

  9. python 随机模块random

  10. PHP--y2k38的解决方法已经时间格式的常用转换

    y2k38又名千年虫问题,又称Uinx Millennium Bug,此漏洞将会影响到所有32位系统下用Unix时间戳整数来记录时间的PHP,及其它编程语言. 一个整型的变量所能保存的最大时间为203 ...