2015 Multi-University Training Contest 2 1002 Buildings
Buildings #
Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5301
#
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 0 0 x 0 0 0 0 0 0 0 0 1 3 0 0 0 0 0 0 0 0 0 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;
}
/*
*/
* 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;
}
/*
*/
作者:北岛知寒
出处:https://www.cnblogs.com/crazyacking/p/4671015.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?