Cricket Field UVA - 1312

题意:一个W*H(1<=W,H<=10000)网格里有有n(0<=n<=100)棵树,要求找一个最大空正方形

思路:枚举y坐标,每次遍历所有点,判断是否有点落在正方形内,有的话维护最优解

#include <bits/stdc++.h>
//#define ll long long
#define ll unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
const int maxn = 100 + 2;
int n,w,h,d[maxn];
struct node
{
    int x,y;
    bool operator <(const struct node & q)const
    {
        if(x == q.x) return y < q.y;
        return x < q.x;
    }
}p[maxn];
void init()
{
    scanf("%d%d%d",&n,&w,&h);
    for(int i = 0;i < n;i++)
    {
        scanf("%d%d",&p[i].x,&p[i].y);
        d[i] = p[i].y;
    }
    d[n] = 0,d[n + 1] = h;
    sort(p,p + n);
    sort(d,d + n + 2);
}
void solve()
{
    int ans = 0,ansx,ansy;
    int m = unique(d,d + n + 2) - d;
    for(int i = 0;i < m;i++)
    {
        for(int j = i + 1;j < m;j++)
        {
            int miny = d[i],maxy = d[j];
            int ww = 0,hh = maxy - miny,tmp = 0;
            for(int k = 0;k < n;k++)
            {
                if(p[k].y <= miny || p[k].y >= maxy) continue;
                ww = p[k].x - tmp;
                if(ans < min(ww,hh))
                {
                    ans = min(ww,hh);
                    ansx = tmp,ansy = miny;
                }
                tmp = p[k].x;
            }
            ww = w - tmp;
            if(ans < min(ww,hh))
            {
                ans = min(ww,hh);
                ansx = tmp,ansy = miny;
            }
        }
    }
    printf("%d %d %d\n",ansx,ansy,ans);
}
int main()
{
    int T; scanf("%d",&T);
    while(T--)
    {
        init();
        solve();
        if(T) printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sgsyacm/article/details/86903008