http://acm.hdu.edu.cn/showproblem.php?pid=5301
题意:n*m的矩形中[x,y]位置不能用,其他位置要全面分成矩形,且每个举行都要临着大矩形的其中一条边界,求每种可能情况 中最大矩形面积的最小值
思路:一直感觉能做,是个思维,但是大概是思路不够清晰,一直WA,搜了下题解,都是说是思维题,规律题,就一直在自己推规律,,最后终于终于推出来了,我的思路是,先是将大矩形旋转成n<=m的矩形,x,y也对应交换,然后以y列所有分割,取较小的那侧,较大的一侧按列长度平分成小矩形,即(n+1)/2;较小的一侧比较按行分割还是按列分割如何最优。
特判【x,y】在靠边的一列的情况。特殊情况还有n==1,2,3的情况和[x,y]在大矩形正中间的情况
感想:这个题做得真的糟心。。一直忽略了【x,y】在正中间的情况,后来画图,凑巧画出来了。。不然还得WA QAQ
拓展:题意 中的一个格子不能占用可以换成一个矩形不能占用。,做法是一样的
代码:
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int n,m,x,y,ans;
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&x,&y))
{
if(n>m) {swap(n,m);swap(x,y);}
if(n==1||n==2) printf("1\n");
else if(n==3)
{
if(m==3&&x==2&&y==2) printf("1\n");
else printf("2\n");
}
else {
if(n==m&&x==y&&x==(n+1)/2)
printf("%d\n",n/2);
else
{
int a,b,c,d;
a=min(y-1,m-y);
b=min(x-1,n-x);
c=max(x-1,n-x);
d=max(b+1,c);
if(a==0) ans=0;
else
{
ans=min(d,a+1);
}
ans=max(ans,(n+1)/2);
printf("%d\n",ans);
}
}
}
}