zoukankan      html  css  js  c++  java
  • 洛谷1578:[WC2002]奶牛浴场——题解

    https://www.luogu.org/problemnew/show/P1578#sub

    由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少。为了讨好奶牛,John决定在牛场中建造一个大型浴场。但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点。这回,他又要求助于Clevow了。你还能帮助Clevow吗?

    John的牛场和规划的浴场都是矩形。浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合。浴场不能覆盖任何产奶点,但是产奶点可以位于浴场的轮廓上。

    Clevow当然希望浴场的面积尽可能大了,所以你的任务就是帮她计算浴场的最大面积。

    (其实并不知道是不是WC2002的题目emm)

    请食用王知昆论文:http://blog.csdn.net/twtsa/article/details/8120269,和洛谷第一篇题解。

    这里使用的是算法1(并不知道什么名字,枚举法?)

    然而那篇题解虽然指出了很多bug的所在以及解决方法,但是代码变量名(自我感觉)很不友好。

    我觉得我的代码还是很清真emm。

    #include<cstdio>
    #include<queue>
    #include<cctype>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int N=2002;
    inline int read(){int x;scanf("%d",&x);return x;}
    struct node{
        int x,y;
    }a[5010];
    bool cmp1(node a,node b){
        return a.x<b.x||(a.x==b.x&&a.y<b.y);
    }
    bool cmp2(node a,node b){
        return a.y<b.y;
    }
    int main(){
        int n=read(),m=read();
        int s=read();
        for(int i=1;i<=s;i++)a[i].x=read(),a[i].y=read();
        a[++s].x=0;a[s].y=0;a[++s].x=n;a[s].y=0;
        a[++s].x=0;a[s].y=m;a[++s].x=n;a[s].y=m;
        sort(a+1,a+s+1,cmp1);
        int ans=0;
        for(int i=1;i<=s;i++){
        int l=0,r=m,v=n-a[i].x;
        for(int j=i+1;j<=s;j++){
            if(l<=a[j].y&&a[j].y<=r){
            if(v*(r-l)<=ans)break;
            ans=max(ans,(a[j].x-a[i].x)*(r-l));
            if(a[i].y==a[j].y)break;
            if(a[j].y>a[i].y)r=min(r,a[j].y);
            else l=max(l,a[j].y);
            }
        }
        l=0,r=m,v=a[i].x;
        for(int j=i-1;j>=1;j--){
            if(l<=a[j].y&&a[j].y<=r){
            if(v*(r-l)<=ans)break;
            ans=max(ans,(a[j].x-a[i].x)*(r-l));
            if(a[i].y==a[j].y)break;
            if(a[j].y>a[i].y)r=min(r,a[j].y);
            else l=max(l,a[j].y);
            }
        }
        }
        sort(a+1,a+s+1,cmp2);
        for(int i=1;i<=s-1;i++)ans=max(ans,(a[i+1].y-a[i].y)*n);
        printf("%d
    ",ans);
        return 0;
    }

    +++++++++++++++++++++++++++++++++++++++++++

     +本文作者:luyouqi233。               +

     +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

    +++++++++++++++++++++++++++++++++++++++++++

  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/8516388.html
Copyright © 2011-2022 走看看