USACO Section 1.4 Packing Rectangles
2014-01-17 19:15
393 查看
题意:
已知4个矩形的l和w 矩形可以旋转和平移 用一块最小面积的新的矩形覆盖4个矩形
求最小的面积 以及新矩形的l和w
思路:
题目已经给出6种摆放方式 按它的方式摆即可
我们要枚举4个矩形是否旋转(只转90度)过 然后枚举每种摆放方式中矩形的编号
代码中的枚举方法是二进制枚举旋转 全排列枚举编号
最后计算所有情况中的答案
第6种摆放方式比较难想 大致思路就是 先放下面两块 在根据下面两块的高度分别讨论上面两块如何摆放
已知4个矩形的l和w 矩形可以旋转和平移 用一块最小面积的新的矩形覆盖4个矩形
求最小的面积 以及新矩形的l和w
思路:
题目已经给出6种摆放方式 按它的方式摆即可
我们要枚举4个矩形是否旋转(只转90度)过 然后枚举每种摆放方式中矩形的编号
代码中的枚举方法是二进制枚举旋转 全排列枚举编号
最后计算所有情况中的答案
第6种摆放方式比较难想 大致思路就是 先放下面两块 在根据下面两块的高度分别讨论上面两块如何摆放
/* ID: housera1 PROG: packrec LANG: C++ */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct rectangle { int l,w; }f[5]; pair<int,int> sol[5005]; int n,ans=2147483640; int order[5]; int main(){ int Debug=0; if(!Debug){ freopen("packrec.in","r",stdin); freopen("packrec.out","w",stdout); } int i,j,x,y; for(i=0;i<4;i++) scanf("%d%d",&f[i].l,&f[i].w); for(i=0,n=0;i<16;i++) { for(j=0;j<4;j++) if(i&(1<<j)) swap(f[j].l,f[j].w); for(j=0;j<4;j++) order[j]=j; do { x=f[order[0]].w+f[order[1]].w+f[order[2]].w+f[order[3]].w; y=max(f[order[0]].l,max(f[order[1]].l,max(f[order[2]].l,f[order[3]].l))); if(x*y<=ans) { if(x*y<ans) n=0,ans=x*y; if(x>y) swap(x,y); sol[n++]=make_pair(x,y); } x=max(f[order[0]].w,f[order[1]].w+f[order[2]].w+f[order[3]].w); y=f[order[0]].l+max(f[order[1]].l,max(f[order[2]].l,f[order[3]].l)); if(x*y<=ans) { if(x*y<ans) n=0,ans=x*y; if(x>y) swap(x,y); sol[n++]=make_pair(x,y); } x=max(f[order[0]].w,f[order[1]].w+f[order[2]].w)+f[order[3]].w; y=max(f[order[0]].l+max(f[order[1]].l,f[order[2]].l),f[order[3]].l); if(x*y<=ans) { if(x*y<ans) n=0,ans=x*y; if(x>y) swap(x,y); sol[n++]=make_pair(x,y); } x=f[order[0]].w+max(f[order[1]].w,f[order[2]].w)+f[order[3]].w; y=max(f[order[0]].l,max(f[order[1]].l+f[order[2]].l,f[order[3]].l)); if(x*y<=ans) { if(x*y<ans) n=0,ans=x*y; if(x>y) swap(x,y); sol[n++]=make_pair(x,y); } x=max(f[order[0]].w,f[order[1]].w)+f[order[2]].w+f[order[3]].w; y=max(f[order[0]].l+f[order[1]].l,max(f[order[2]].l,f[order[3]].l)); if(x*y<=ans) { if(x*y<ans) n=0,ans=x*y; if(x>y) swap(x,y); sol[n++]=make_pair(x,y); } if(f[order[1]].l==f[order[2]].l) x=max(f[order[1]].w+f[order[2]].w,f[order[0]].w+f[order[3]].w); else if(f[order[1]].l<f[order[2]].l) x=max(f[order[1]].w+f[order[2]].w,f[order[0]].w+max(f[order[2]].w,f[order[3]].w)); else if(f[order[1]].l>f[order[2]].l) x=max(f[order[1]].w+f[order[2]].w,f[order[3]].w+max(f[order[0]].w,f[order[1]].w)); y=max(f[order[0]].l+f[order[1]].l,f[order[2]].l+f[order[3]].l); if(x*y<=ans) { if(x*y<ans) n=0,ans=x*y; if(x>y) swap(x,y); sol[n++]=make_pair(x,y); } }while(next_permutation(order,order+4)); for(j=0;j<4;j++) if(i&(1<<j)) swap(f[j].l,f[j].w); } printf("%d\n",ans); sort(sol,sol+n); for(i=0;i<n;i++) { if(i!=0&&sol[i].first==sol[i-1].first&&sol[i].second==sol[i-1].second) continue; printf("%d %d\n",sol[i].first,sol[i].second); } return 0; }
相关文章推荐
- USACO Section 1.4 - Mother's Milk(DFS + 记忆化)
- USACO Section1.4 Arithmetic Progressions
- USACO Section 1.4 Arithmetic Progressions
- USACO-Section1.4 Mother's Milk [搜索]
- USACO Section 1.4 More Search Technique
- USACO Section 1.4 Mother's Milk
- USACO Section 1.4 Mother's Milk 搜索
- USACO Section 1.4 - Arithmetic Progressions (暴力)
- USACO - Chapter1 Section 1.4 - Arithmetic Progressions
- USACO-Section1.4 Arithmetic Progressions[其他][暴力枚举]
- USACO-Section1.4 Arithmetic Progressions
- 等差数列 [USACO Training Section 1.4]
- USACO-Section 1.4 Mother's Milk(BFS)
- USACO - Chapter1 Section 1.4 - Mother's Milk
- USACO-Section1.4 Mother's Milk
- USACO-Section1.4 airprog[枚举]
- USACO: Section 1.4 -- PROB Arithmetic Progressions
- USACO-Section1.4 Mother's Milk
- USACO-Section1.4 milk3[深搜]
- [USACO 1.4] Summary of Section 1.4