高效算法设计专项:LA 2689
2013-05-01 21:47
295 查看
注意到W、H很大,所以不可能用扫描法。注意到n很小,所以可以用点将矩形切割,然后枚举所有矩形即可。具体实现我也是看了题解才知道怎么做……
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct rec { int x,y; int w,h; } r[1000000]; int main() { freopen("in.txt","r",stdin); int T; cin>>T; while(T--) { int n,W,H; cin>>n>>W>>H; int cnt=0; r[cnt].x=r[cnt].y=0; r[cnt].w=W;r[cnt].h=H; cnt++; for(int i=0;i<n;i++) { int a,b; cin>>a>>b; for(int j=0;j<cnt;j++) { int x=r[j].x,y=r[j].y,w=r[j].w,h=r[j].h; if(a>x&&a<x+w&&b>y&&b<y+h) { r[cnt].x=x,r[cnt].y=y,r[cnt].w=w,r[cnt++].h=b-y; r[cnt].x=x,r[cnt].y=y,r[cnt].w=a-x,r[cnt++].h=h; r[cnt].x=a,r[cnt].y=y,r[cnt].w=w-a+x,r[cnt++].h=h; r[cnt].x=x,r[cnt].y=b,r[cnt].w=w,r[cnt++].h=h-b+y; r[j].w=0; } } } int ans=0,p; for(int i=0;i<cnt;i++) { int tmp=min(r[i].w,r[i].h); if(ans<tmp) { ans=tmp; p=i; } } cout<<r[p].x<<" "<<r[p].y<<" "<<ans<<endl; if(T) cout<<endl; } return 0; }
相关文章推荐
- 高效算法设计专项:LA 4356
- 高效算法设计专项:LA 4726
- 高效算法设计专项:LA 2963
- 高效算法设计专项:UVa 10691
- 高效算法设计专项:UVa 11572
- SEERC 2006 Subsequence, 高效算法设计 ,LA 2678
- 高效算法设计专项:UVa 10125
- 高效算法设计专项:UVa 10810
- 高效算法设计专项:UVa 10827
- 高效算法设计专项:UVa 10535
- 高效算法设计专项:UVa 10391
- 高效算法设计专项:UVa 10730
- 高效算法设计专项:UVa 11054
- 集训第四周(高效算法设计)D题 (区间覆盖问题)
- 如何设计一个高效算法从N个正整数中,随机选取n个不同的随机数 n<=N
- 【高效算法设计——最大值最小问题】UVa 714 Coying Books
- 算法竞赛入门经典:第八章 高效算法设计 8.3归并排序应用之逆序对数
- 算法竞赛入门经典:第八章 高效算法设计 8.9棋盘覆盖
- 高效算法设计_算法分析初步(最大连续和)
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效