请教大神。

本题极大化思想水题。

我的写法是不增加四个限制点,首先特判一行的,然后从左往右扫,从右往左扫。每个结点作为左(右)边界扫到最后一个时,特判最后一个到矩形另一边的面积。

这样做会出现第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 条评论

  • @ 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

信息

ID
1055
难度
5
分类
动态规划 点击显示
标签
递交数
2106
已通过
653
通过率
31%
被复制
10
上传者