HDU.5128 The E-pang Palace
生活随笔
收集整理的這篇文章主要介紹了
HDU.5128 The E-pang Palace
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【題意】
N<=30個點(diǎn),求兩個不touch,不cross的矩形,并求出最大面積和,拼不出兩個矩形輸出imp.
【解題方法】
暴力對角線兩個點(diǎn),再暴力另外一條對角線兩個點(diǎn),接下來就是對合法性和相交的各種跑判斷了,轉(zhuǎn)移這里有一個特別大的坑點(diǎn),那就是小矩形可能在大矩形里面。。。
【AC 代碼】
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn=1e5+10,INF=0x3f3f3f3f; int n; struct Point{int x,y;void read(){scanf("%d%d",&x,&y);} }A[33]; bool vis[205][205]; int l,r,up,down; void init() {memset(vis,false,sizeof(vis)); } bool online(Point &a,Point &b) {return a.x==b.x||a.y==b.y; } bool isLegal(Point &a) {if(a.x>=l&&a.x<=r&&a.y>=down&&a.y<=up) return 0;return 1; } bool isIn(Point &a){return (a.x>l&&a.x<r&&a.y>down&&a.y<up); } int getArea(Point a,Point b,Point &c,Point &d) {if(a.x>b.x) swap(a,b);c=Point{a.x,b.y};d=Point{b.x,a.y};if(vis[c.x][c.y]&&vis[d.x][d.y]) return abs(a.x-b.x)*abs(a.y-b.y);return -INF; }int main() {while(scanf("%d",&n)!=EOF){if(n==0) break;init();for(int i=1; i<=n; i++){A[i].read();vis[A[i].x][A[i].y]=true;}Point C,D;int ans=-INF;//枚舉第一條對角線for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(online(A[i],A[j])) continue;int tmp=getArea(A[i],A[j],C,D);if(tmp==-INF) continue;l=min(A[i].x,A[j].x);r=max(A[i].x,A[j].x);up=max(A[i].y,A[j].y);down=min(A[i].y,A[j].y);//枚舉第二條對角線for(int k=1; k<=n; k++){for(int l=1; l<=n; l++){if(online(A[k],A[l])) continue;int tmp2=getArea(A[k],A[l],C,D);if(tmp2==-INF||tmp<tmp2) continue;if(isIn(A[k])&&isIn(A[l])&&isIn(C)&&isIn(D)){ans=max(ans,tmp);}if(!isLegal(A[k])||!isLegal(A[l])||!isLegal(C)||!isLegal(D)) continue;ans=max(ans,tmp+tmp2);}}}}if(ans==-INF){puts("imp");}else{printf("%d\n",ans);}} }總結(jié)
以上是生活随笔為你收集整理的HDU.5128 The E-pang Palace的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何编写和精灵宝可梦一样的 app?
- 下一篇: CMMI查询/CMMI认证查询/CMMI