题目链接:
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.youkuaiyun.com/consciousman/article/details/52987122这个说的挺好,怎么跑起来这么慢。。。