oldssoj1107奶牛浴场(最大子矩阵)

本文探讨如何在牛场中合理布局浴场,以避免覆盖产奶点的同时最大化浴场面积。通过算法计算,实现牛场资源的有效利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少。为了讨好奶牛,John决定在牛场中建造一个大型浴场。但是 John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建 造的浴场不覆盖这些产奶点。这回,他又要求助于Clevow了。你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形。浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合。浴场不能覆盖任何产奶 点,但是产奶点可以位于浴场的轮廓上。 Clevow当然希望浴场的面积尽可能大了,所以你的任务就是帮她计算浴场的最大面积。

输入

输入文件的第一行包含两个整数L和W,分别表示牛场的长和宽。文件的第二行包含一个整数n,表示产奶点的数量。以下n行每行包含两 个整数x和y,表示一个产奶点的坐标。所有产奶点都位于牛场内,即:0<=x<=L,0<=y<=W。

输出

输出文件仅一行,包含一个整数S,表示浴场的最大面积。

样例输入

10 1041 19 11 99 9

样例输出

80

提示

【参数约定】
0 < n < 5000
1 < L,W <30000


#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn=5003;
struct data{
    int x,y;
}a[maxn];
int l,w,n,up,dn,ans=0;
bool cmp1(const data&aa,const data&bb){
    return(aa.x<bb.x);
}
bool cmp2(const data&aa,const data&bb){
    return(aa.x>bb.x);
}
inline int work(){
    for(int i=1;i<=n;++i){
        up=w,dn=0;
        for(int j=i+1;j<=n;++j){
            if(a[j].x==a[i].x)continue;
            ans=max(ans,(up-dn)*(a[j].x-a[i].x));
            if(a[j].y<=a[i].y && a[j].y>dn)dn=a[j].y;
            if(a[j].y>=a[i].y && a[j].y<up)up=a[j].y;
            if(up<=dn)break;
        }
    }
}
inline int get(){
    char c;while(!isdigit(c=getchar()));
    int v=c-48;while(isdigit(c=getchar()))v=v*10+c-48;
    return v;
}
int main(){
    l=get();w=get();n=get();    
    for(int i=1;i<=n;++i)a[i].x=get(),a[i].y=get();
    a[++n].x=0,a[n].y=0;
    a[++n].x=0,a[n].y=w;
    a[++n].x=l,a[n].y=0;
    a[++n].x=l,a[n].y=w;
    sort(a+1,a+1+n,cmp1);
    work();
    printf("%d\n",ans);
    return 0;
}

思想:见王知昆论文。注意边界的四点要加入。l和w的区分。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值