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这个说的挺好,怎么跑起来这么慢。。。
阅读全文
1 0