您的位置:首页 > 其它

极大化思想——洛谷 P1578 奶牛浴场

2017-06-29 11:18 465 查看
https://www.luogu.org/problem/show?pid=1578

论文

https://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html

论文里面唯一的错误就是第一个算法需要添加的点不仅仅是左下右上,4个顶角都要的;

为什么自己模拟就知道了;

#include<bits/stdc++.h>
#define Ll long long
using namespace std;
const int N=5e3+5;
struct cs{int x,y;}d
;
int n,m,t,ans;
bool cmp1(cs a,cs b){return a.y<b.y;}
bool cmp2(cs a,cs b){return a.x<b.x;}
bool cmp3(cs a,cs b){return a.y>b.y;}
void work(){
for(int i=1;i<=t;i++){
int ma=n,mi=0;
for(int j=i+1;j<=t;j++){
if(d[j].x>ma||d[j].x<mi)continue;
ans=max(ans,abs(d[i].y-d[j].y)*(ma-mi));
if(d[j].x<d[i].x)mi=d[j].x;else ma=d[j].x;
if(ma==mi)break;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=t;i++)scanf("%d%d",&d[i].x,&d[i].y);
d[++t].x=0;d[t].y=0;d[++t].x=n;d[t].y=m;
d[++t].x=0;d[t].y=m;d[++t].x=n;d[t].y=0;
sort(d+1,d+t+1,cmp2);
for(int i=2;i<=t;i++)ans=max(ans,m*(d[i].x-d[i-1].x));
sort(d+1,d+t+1,cmp1);work();
sort(d+1,d+t+1,cmp3);work();
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: