- 奶牛浴场
- 2015-06-15 00:18:18 @
本题极大化思想水题。
我的写法是不增加四个限制点,首先特判一行的,然后从左往右扫,从右往左扫。每个结点作为左(右)边界扫到最后一个时,特判最后一个到矩形另一边的面积。
这样做会出现第0个点,第6个点的错误。
为什么?求教...
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int N=5001;
struct Q
{
int x,y;
}q[N];
int n,l,w;
int res;
inline int max(int i,int j)
{
return i>j?i:j;
}
inline int cmp1(Q qa,Q qb)
{
return qa.y<qb.y;
}
inline int cmp2(Q qa,Q qb)
{
return qa.x<qb.x;
}
inline int cmp3(Q qa,Q qb)
{
return qa.x>qb.x;
}
int main(void)
{
scanf("%d%d%d",&l,&w,&n);
for (int i=1;i<=n;i++) scanf("%d%d",&q[i].x,&q[i].y);
sort(q+1,q+n+1,cmp1);
for (int i=2;i<=n;i++) res=max(res,(q[i].y-q[i-1].y)*l);
int u,d;
sort(q+1,q+n+1,cmp2);
for (int i=1;i<=n;i++)
{
u=w,d=0;
for (int j=i+1;j<=n;j++)
if (d<=q[j].y&&q[j].y<=u)
{
res=max(res,(u-d)*(q[j].x-q[i].x));
q[i].y<q[j].y?u=q[j].y:d=q[j].y;
if (u==d) break;
}
res=max(res,(l-q[n].x)*(u-d)); //这里是特判
}
sort(q+1,q+n+1,cmp3);
for (int i=1;i<=n;i++)
{
u=w,d=0;
for (int j=i+1;j<=n;j++)
if (d<=q[j].y&&q[j].y<=u)
{
res=max(res,(u-d)*(q[i].x-q[j].x));
q[i].y<q[j].y?u=q[j].y:d=q[j].y;
if (u==d) break;
}
res=max(res,q[n].x*(u-d)); //这里是特判
}
printf("%d\n",res);
return 0;
}
2 条评论
-
y20070316 LV 9 @ 2015-06-15 00:25:35
已解决。本方法需要特判n=0时直接输出l*w后可Accept。
但是不能保证不出现数据水的情况,所以再问一下这个方法行不行,谢谢! -
2015-06-15 00:21:21@
找到一个特判错误,改成:
res=max(res,(l-q[i].x)*(u-d))
res=max(res,q[i].x*(u-d))
然后第0个点错了。
- 1