http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2401
话说GSB 出的这个题确实不大好想,给定题意不说了。
才开始我们想的是从左到右,从上往下走一边,找相邻连点两重循环找最大面积,敲出来一交WA,郁闷,才开始我们都认为这个办法对,想了很长时间,到最后ZC出了各情况直接给否定了,主要是我们没有考虑上下界问题。同样只要考虑好上下界,还是按那个思路左右上下走一边,最后求出最大值即可。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define maxn 1007 using namespace std; struct node { int x,y; }p[maxn]; int n,tal,l,w; int cmpx(node a,node b) { if (a.x != b.x) return a.x < b.x; else return a.y < b.y; } int cmpy(node a,node b) { if (a.y != b.y) return a.y < b.y; else return a.x < b.x; } int LR() { int i,j,ans; ans = 0; for (i = 0; i < tal; ++i) { int top = w, down = 0; for (j = i + 1; j < tal; ++j) { if (p[i].x != p[j].x) { ans = max(ans,(p[j].x - p[i].x)*(top - down)); //更新上下界 if (p[j].y > p[i].y) top = min(top,p[j].y); else down = max(down,p[j].y); } } } return ans; } int UD() { int i,j,ans; ans = 0; for (i = 0; i < tal; ++i) { int L = 0, R = l; for (j = i + 1; j < tal; ++j) { if (p[i].y != p[j].y) { ans = max(ans,(p[j].y - p[i].y)*(R - L)); //更新左右界 if (p[j].x > p[i].x) R = min(R,p[j].x); else L = max(L,p[j].x); } } } return ans; } int main() { //freopen("data.in","r",stdin); int i,t; scanf("%d",&t); while (t--) { scanf("%d%d",&l,&w); scanf("%d",&n); if (n == 0) { printf("%d\n",l*w); continue; } //作为结束的边界 p[0].x = p[0].y = 0; p[1].x = l; p[1].y = w; tal = 2; for (i = 0; i < n; ++i) { scanf("%d%d",&p[tal].x,&p[tal].y); tal++; } //按X轴排序,从左到右查找 sort(p,p+tal,cmpx); int l = LR(); //按Y轴排序从上往下查找 sort(p,p+tal,cmpy); int d = UD(); //取最大值 printf("%d\n",max(l,d)); } return 0; }