AcWing 5180. 正方形泳池


原题链接:5180. 正方形泳池 - AcWing题库

说实话题解和视频题解都不太好,有点过于复杂了,那就不得不记录一下我看视频题解衍生出的另一个较为简单的思路了。

根据答案形态出发,枚举所有这种形态找出最大值。

可以发现最大的泳池要么是左右边界被两棵树限制住了,或者就是上下边界被两棵树限制住了。
所以我们可以穷举所有两棵树的组合,并且以这两棵树y的差值或者x的差值为正方形的边长,来放下泳池。最大的泳池,必然在这些组合里面。

放下泳池有限制条件,假设以y的差值放下去,那么可用的连续x也必须大于等于y的差值,两棵树之间可能会有其他树来碍事,那么这里的x就会被断开成好几段,需要找出最大的那个x。

这种只有一棵树的,因为泳池不能超过边界,所以相当于外面围了一圈树,只要在四个角落种上树就好了。

AC代码

#include <bits/stdc++.h>
using namespace std;

int N,T,ans=INT_MIN;
struct tree{
    int x,y;
}t[105];
vector<int>tmp;
bool cmpy(tree a,tree b){
    return a.y<b.y;
}
bool cmpx(tree a,tree b){
    return a.x<b.x;
}

int main(){
    cin>>N>>T;
    for(int i=1;i<=T;++i)
        cin>>t[i].x>>t[i].y;

    t[++T]={0,0};
    t[++T]={0,N+1};
    t[++T]={N+1,0};
    t[++T]={N+1,N+1};

    sort(t+1,t+1+T,cmpy);
    for(int i=1;i<=T;++i){
        for(int j=i+1;j<=T;++j){
            tmp.push_back(0);
            tmp.push_back(N+1);
            for(int k=i+1;k<j;++k)
                tmp.push_back(t[k].x);

            sort(tmp.begin(),tmp.end());
            int xmax=INT_MIN;
            for(int k=0;k<tmp.size()-1;++k)
                xmax=max(xmax,tmp[k+1]-tmp[k]-1);
            ans=max(ans,min(xmax,t[j].y-t[i].y-1));
            tmp.clear();
        }
    }

    sort(t+1,t+1+T,cmpx);
    for(int i=1;i<=T;++i){
        for(int j=i+1;j<=T;++j){
            tmp.push_back(0);
            tmp.push_back(N+1);
            for(int k=i+1;k<j;++k)
                tmp.push_back(t[k].y);

            sort(tmp.begin(),tmp.end());
            int ymax=INT_MIN;
            for(int k=0;k<tmp.size()-1;++k)
                ymax=max(ymax,tmp[k+1]-tmp[k]-1);
            ans=max(ans,min(ymax,t[j].x-t[i].x-1));
            tmp.clear();
        }
    }

    cout<<ans<<endl;
    return 0;
}

思路很简单,但是说也不太说的明白。

重点:枚举所有答案形态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值