C

来源:互联网 发布:淘宝16年被扣24分 编辑:程序博客网 时间:2024/06/05 20:53

题目链接

https://cn.vjudge.net/contest/180311#problem/C     或者   http://acm.hdu.edu.cn/showproblem.php?pid=5128

解题思路:

这道题其实挺简单的,就是枚举出所有的矩形,再判断是不是合法的就OK了;

WA了一次在这里:

a[i].x != a[j].x && a[i].y != a[j].y
还有就是如果大的矩形包含小的矩形就取大的面积。

复杂度:选取两个点就可判断是否为矩形,这里是顶多n^2就可以跑完,好,现在有了顶多n^2个矩形,存在一个结构体里面,再遍历两次,最后n^4结束。

上代码:

#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;#include<queue>int n;struct Matrix{    int x1;    int x2;    int y1;    int y2;} m[30];struct Node{    int x;    int y;} a[50];int b[300][300];bool cmp(Node a, Node b){    return a.x < b.x;}int main(){//    freopen("in.txt", "r", stdin);    while(scanf("%d", &n) && n)    {        memset(b, 0, sizeof(b));        memset(a, 0, sizeof(a));        for(int i = 0; i < n; i ++)        {            scanf("%d%d", &a[i].x, &a[i].y);            b[a[i].x][a[i].y] = 1;        }        sort(a, a + n, cmp);        int t = 0;        for(int i = 0; i < n; i ++)        {            for(int j = i + 1; j < n; j ++)            {                if(b[a[i].x][a[j].y] == 1 && b[a[j].x][a[i].y] == 1 && a[i].x != a[j].x && a[i].y != a[j].y)                {                    m[t].x1 = min(a[i].x, a[j].x);                    m[t].x2 = max(a[j].x, a[i].x);                    m[t].y1 = max(a[i].y, a[j].y);                    m[t++].y2 = min(a[i].y,a[j].y);                }            }        }//        printf("%d\n", t);//        for(int i = 0; i < t; i ++)//        {//            printf("%d %d %d %d*\n", m[i].x1, m[i].x2, m[i].y1, m[i].y2);//        }        int maxS = -1;        int S = 0;        int pp = 0;        for(int i = 0; i < t; i ++)        {            for(int j = i + 1; j < t; j ++)            {                if(m[i].y1 < m[j].y2 ||                        m[i].x2 < m[j].x1 ||                        m[i].y2 > m[j].y1 ||                        m[i].x1 > m[j].x2 )                {                    S = abs(m[i].x1 - m[i].x2) * abs(m[i].y1 - m[i].y2) +                        abs(m[j].x1 - m[j].x2) * abs(m[j].y1 - m[j].y2);//                            printf("+%d %d \n", m[i].y1 , m[j].y2);//                            printf("%d %d \n", m[i].x2 , m[j].x1);//                            printf("%d %d \n", m[i].y2 , m[j].y1);//                            printf("%d %d+ \n\n", m[i].x1 , m[j].x2);                    pp = 1;//                    printf("-");                }                else if(m[i].x1 < m[j].x1 && m[i].x2 > m[j].x2 && m[i].y1 > m[j].y1 && m[i].y2 < m[j].y2 ||                        m[j].x1 < m[i].x1 && m[j].x2 > m[i].x2 && m[j].y1 > m[i].y1 && m[j].y2 < m[i].y2  )                {                    S = max(abs(m[i].x1 - m[i].x2) * abs(m[i].y1 - m[i].y2),                            abs(m[j].x1 - m[j].x2) * abs(m[j].y1 - m[j].y2));                    pp = 1;//                    printf("+");                }                maxS = max(S, maxS);            }        }        if(pp == 1)            printf("%d\n", maxS);        else if(pp == 0)            printf("imp\n");    }}

emmm。。。




http://blog.csdn.net/consciousman/article/details/52987122这个说的挺好,怎么跑起来这么慢。。。