博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2015 Multi-University Training Contest 2 1002 Buildings
阅读量:6501 次
发布时间:2019-06-24

本文共 1753 字,大约阅读时间需要 5 分钟。

Buildings 

Problem's Link:


 

Mean: 

n*m列的网格,删除一个格子x,y,用矩形来填充矩阵。且矩形至少有一边是在矩阵的边缘上。

要使最大矩形的面积最小,求满足条件的矩形填充方式中面积最大的矩形。

analyse:

任何矩形都可以分为宽度为1的小矩形,所以只考虑矩形的可以的最小长度即可。

讨论:

不删除格子时:最小长度为min((n+1)/2,(m+1)/2) = len

n = m:

n为奇数,且当x,y在正中心的时候,len- 1即可

其他条件len不变 , 显然成立。

n != m:

如果n > m swap(n,m), swap(x,y)

由于对称性,把矩阵分为四块,把x,y变换到矩阵的右上角。

可以知道 删除点后len只能变大不能变小。

且即使增大不会大于 (m+1)/2。

0 0 0 0 0 0 0 0 0 00 x 0 0 0 0 0 0 0 01 3 0 0 0 0 0 0 0 00 2 0 0 0 0 0 0 0 0

 

如图:x下方的3必须被矩形覆盖,那么长度 为 min(1 到3的长度,2到3的长度)

然后取min((m+1)/2, max(len,min(1-->3,2-->3)))即可。

Time complexity: O(N)

 

Source code: 

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-07-23-18.23
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define  LL long long
#define  ULL unsigned long long
using
namespace
std;
int
main()
{
     
ios_base
::
sync_with_stdio(
false );
     
cin
.
tie(
0 );
     
int n
,
m
,
x
,
y;
     
while(
cin
>> n
>>
m
>>
x
>>
y )
     
{
           
int
max1
,
max2
,
max3
,
max4
,
maxn;
           
max1
=
max2
=
max3
=
max4
=
maxn
=
0;
           
max1
=
min(
min( n
-
x
+
1
,
x
),
m
-
y );
           
max2
=
min(
min( n
-
x
+
1
,
x
),
y
-
1 );
           
max3
=
min(
min(
m
-
y
+
1
,
y
), n
-
x );
           
max4
=
min(
min(
m
-
y
+
1
,
y
),
x
-
1 );
           
maxn
=
max(
max(
max1
,
max2
),
max(
max3
,
max4 ) );
//            if(n<m) swap(n,m),swap(x,y);
//            maxn=min(max(x-1,n-x), min(m-y+1,y));
           
if( (
m
== n )
&& (
m
%
2
==
1 ) )
           
{
                 
if( (
x
==
y )
&&
x
== ( (
m
+
1 )
/
2 ) )
                 
{
                       
cout
<<
m
/
2
<<
endl;
                       
continue;
                 
}
                 
cout
<<
max(
maxn
, (
m
+
1 )
/
2 )
<<
endl;
                 
continue;
           
}
           
int
minn
=
min( n
,
m );
           
cout
<<
max(
maxn
, (
minn
+
1 )
/
2 )
<<
endl;
     
}
     
return
0;
}
/*
*/

 

转载地址:http://cdvyo.baihongyu.com/

你可能感兴趣的文章
[zz]在linux中出现there are stopped jobs 的解决方法
查看>>
Delphi下实现全屏快速找图找色 一、数据提取
查看>>
Dissecting a C# Application: Inside SharpDevelop Announcement
查看>>
查询表字段信息
查看>>
Mysql中文输入出现1366错误的解决办法
查看>>
CentOS 6.4 x86_64 安装GCC 4.7.3
查看>>
logback与Log4J的区别
查看>>
关于机器学习的最佳科普文章:《从机器学习谈起》
查看>>
ssh相互访问不用密码
查看>>
Function Pointer
查看>>
Weblogic起步(一) - 配置数据源
查看>>
before伪类的超有用应用技巧——水平菜单竖线分隔符
查看>>
SQL中的IF ELSE(CASE语句的使用)
查看>>
咏南新CS三层开发框架
查看>>
dxFlowChart运行时调出编辑器
查看>>
TDiocpCoderTcpServer返回数据记录有条数限制的问题
查看>>
NET Framework 3.0 (WinFX) RTM发布
查看>>
spark0.9分布式安装
查看>>
互动网计算机频道图书7日销售排行(08.05-08.11)
查看>>
HDU 4666 Hyperspace(优先队列)
查看>>