Java练习 SDUT-2401最大矩形面积
最大矩形面积
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最大矩形面积的更多相关文章
- Java实现 蓝桥杯VIP基础练习 矩形面积交
描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入 输入仅包含两行,每行描述一个矩形. 在每行中,给出矩 ...
- 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( ...
- Java实现 LeetCode 223 矩形面积
223. 矩形面积 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积. 每个矩形由其左下顶点和右上顶点坐标表示,如图所示. Rectangle Area 示例: 输入: -3, 0, 3, 4 ...
- 2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)
矩形面积 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 3265 扫描线(矩形面积并变形)
Posters Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- Largest Rectangle in a Histogram(最大矩形面积,动态规划思想)
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU1542 扫描线(矩形面积并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板
好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解.现在来水一水博客,写一下若干年前的题目的题解. Atlantis Time Limit: 2000/1000 MS (Java/Ot ...
随机推荐
- (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)
Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1) IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...
- HDU 3086 马拉车模板
模板,但是对这个算法还是不太清楚,真实不明觉厉.... #include <iostream> #include <cstdio> #include <string.h& ...
- Redis源码解析:20sentinel(一)初始化、建链
sentinel(哨兵)是redis的高可用解决方案.由一个或多个sentinel实例组成的分布式系统,可以监控任意多个主节点,以及它们属下的所有从节点.当某个主节点下线时,sentinel可以将下线 ...
- Redis源码解析:12AOF持久化
除了RDB持久化功能之外,Redis还提供了AOF(AppendOnly File)持久化功能.与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行 ...
- 通过游戏学python 3.6 第一季 第三章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码 可复制直接使用 娱乐 可封装 函数
猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码 #猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码 import random secrst = random.rand ...
- LUOGU P3111 [USACO14DEC]牛慢跑Cow Jog_Sliver
传送门 解题思路 比较简单的一道思路题,首先假设他们没有前面牛的限制,算出每只牛最远能跑多远.然后按照初位置从大到小扫一遍,如果末位置大于等于前面的牛,那么就说明这两头牛连一块了. 代码 #inclu ...
- Unknown command: crawl
Use "scrapy" to see available commands 1.使用命令行方式cmd,是因为没有cd到项目的根目录,crawl会去搜索cmd目录下的scrapy. ...
- promise基础和进阶
本文不对Promise的做过深的解析,只对基础的使用方法,然后会记录一些promise的使用技巧,可以巧妙的解决异步的常见问题. 在过去一直理解的是解决了一直异步回调的坑,但是用了npm async之 ...
- CesiumLab V1.3 新功能 MAX场景处理(免费Cesium处理工具集)
每次到写文章的时候就很高兴,意味着又有重大功能更新了,也意味着10多天昏天黑地的闭关日子暂时结束了. 依照惯例,先放图 小范围精模型cesium加载效果 大范围白模cesium加载效果 ...
- jframe 设置左上角和任务栏的图标
默认就是 改成有意义的,一眼就能看出来功能的,比如一个小蜘蛛 第一个最简单的做法,把图片扔到工程的根目录,但是这样会相当乱,不便于文件管理 ImageIcon icon = new ImageIcon ...