2014广州站 B - The E-pang Palace(暴力)

来源:互联网 发布:字符串快速匹配算法 编辑:程序博客网 时间:2024/04/28 09:40

题目地址

题目大意:给出n个点,求这n个点(n<=30)构成的2个矩形的总面积最大,2个矩形完全不想交且平行坐标轴,但是可以完全包含(不重合)

解题思路:n很小,暴力,先求出所有平行于坐标轴的矩形,再在满足题意的矩形中分类(完全不想交or完全包含)求最大,求所有矩形的时候以2个对角点来确定矩形,输入点的时候标记一下点是否存在(用来确定对角点的另2点)

#include<bits/stdc++.h>using namespace std;const int maxn = 30+10;const int maxm = 200+10;int dot[maxm][maxm];//标记点存在struct Point{    int x,y;}p[maxn];bool cmp(Point a,Point b){    if(a.x == b.x)        return a.y < b.y;    return a.x < b.x;}struct Rec //矩形{    Point A,B;//A为左下角,B为右上角    int area;}rec[maxm];int result(int a,int b) //判断2个矩形的相对位置{    if(rec[a].B.x < rec[b].A.x) return 1;//相离    if(rec[a].B.y < rec[b].A.y) return 1;//相离    if(rec[a].A.x < rec[b].A.x && rec[a].A.y < rec[b].A.y && rec[a].B.x > rec[b].B.x && rec[a].B.x > rec[b].B.x)    return 2;//相嵌    return 0;}int main(){    int n;    while(scanf("%d",&n) != EOF)    {        if(!n)  break;        memset(dot,0,sizeof(dot));        for(int i = 1; i <= n; i++)        {            scanf("%d%d",&p[i].x,&p[i].y);            dot[p[i].x][p[i].y] = 1;        }        sort(p+1,p+n+1,cmp);        int cnt = 1;        for(int i = 1; i <= n; i++)        {            for(int j = i+1; j <= n; j++)            {                if(p[i].x < p[j].x && p[i].y < p[j].y) //2角                {                    if(dot[p[i].x][p[j].y] && dot[p[j].x][p[i].y]) //另外2角存在                    {                        rec[cnt].A = p[i];                        rec[cnt].B = p[j];                        rec[cnt].area = (p[j].x-p[i].x)*(p[j].y-p[i].y);                        //printf("%d %d\n",cnt,rec[cnt].area);                        cnt++;                    }                }            }        }        //printf("%d\n",cnt);        int maxx = -1;        for(int i = 1; i < cnt; i++)        {            for(int j = i+1; j < cnt; j++)            {                if(result(i,j) == 1)                    maxx = max(maxx,rec[i].area+rec[j].area);                else if(result(i,j) == 2)                    maxx = max(maxx,rec[i].area);            }        }        if(maxx == -1)            puts("imp");        else            printf("%d\n",maxx);    }    return 0;}


0 0