题意:
在w*h的坐标上给n个点, 然后求一个最大的矩形,使得这个矩形内(不包括边界)没有点,注意边界上是可以有点的。
分析:
把坐标离散化。通过两重循环求矩形的高,然后枚举,看是否能找到对应的矩形。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int maxn=120;int n,w,h;int d[maxn];struct Node{ int x,y; bool operator < (const Node &a) const { if(x==a.x) return y<a.y; return x<a.x; }};Node node[maxn];void solve(){ sort(node+1,node+n+1); sort(d,d+n+2); int ans=0; int ansx,ansy; int i,j,k; for(i=0;i<=n+1;i++) { for(j=i+1;j<=n+1;j++) { int high=d[j],low=d[i],temp=0,r=high-low,c; for(k=1;k<=n;k++) { if(node[k].y<=low||node[k].y>=high) continue; c=node[k].x-temp; if(ans<min(r,c)) { ans=min(r,c); ansx=temp; ansy=low; } temp=node[k].x; } c=w-temp; if(ans<min(r,c)) { ans=min(r,c); ansx=temp; ansy=low; } } } printf("%d %d %d\n",ansx,ansy,ans);}int main(){ int cas; int flag=1; scanf("%d",&cas); while(cas--) { scanf("%d%d%d",&n,&w,&h); d[0]=0; d[n+1]=h; int i; for(i=1;i<=n;i++) { scanf("%d%d",&node[i].x,&node[i].y); d[i]=node[i].y; } solve(); if(cas!=0) printf("\n"); }}
时间: 2024-10-07 06:13:48