[USACO] 铺放矩形块 题解

题目大意:

  给定4个矩形块,找出一个最小的封闭矩形将这4个矩形块放入,但不得相互重叠。所谓最小矩形指该矩形面积最小。

思路:

  枚举矩形的安放顺序,再按照题目所给的图判断即可,主要要想到枚举。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int i,n,sum=10009,p[5],q[5],a[5],b[5];
 4 struct data { int x,y; }ans[10000];
 5 bool used[5];
 6
 7 bool cmp(data a,data b) { return a.x<b.x; }
 8
 9 void pd(int l,int r)
10 {
11     if (l*r<sum)
12     {
13         sum=l*r,ans[n=1].x=l,ans[1].y=r;
14         if (l>r) swap(ans[1].x,ans[1].y);
15         return;
16     }
17     if (l*r==sum)
18     {
19         ans[++n].x=l,ans[n].y=r;
20         if (l>r) swap(ans[n].x,ans[n].y);
21     }
22 }
23
24 void dfs(int k)
25 {
26     if (k>4)
27     {
28         int l=0,r=0,i;
29         for (i=1;i<5;i++) l=max(l,p[i]),r+=q[i];
30         pd(l,r);//1
31         for (l=r=0,i=1;i<4;i++) l=max(l,p[i]),r+=q[i];
32         pd(l+p[4],max(r,q[4]));//2
33         l=max(p[1],p[2])+p[3],r=max(q[1]+q[2],q[3]);
34         pd(max(l,p[4]),r+q[4]);//3
35         l=max(p[1],p[2]),r=max(q[3],q[4]);
36         pd(l+p[3]+p[4],max(r,q[1]+q[2]));//5
37         l=max(p[1]+p[2],p[3]+p[4]);
38         if (q[1]>=q[2])
39             if (q[4]>q[3]) pd(l,q[1]+q[4]);
40             else
41                 if (p[1]+p[3]<=l) pd(l,max(q[1]+q[4],q[2]+q[3]));//6
42         return;
43     }
44     for (int i=1;i<5;i++)
45         if (!used[i])
46         {
47             used[i]=1;
48             p[k]=a[i],q[k]=b[i],dfs(k+1);
49             p[k]=b[i],q[k]=a[i],dfs(k+1);
50             used[i]=0;
51         }
52 }
53
54 int main()
55 {
56     for (i=1;i<5;i++) scanf("%d%d",&a[i],&b[i]);
57     dfs(1),sort(ans+1,ans+n+1,cmp),printf("%d\n",sum);
58     printf("%d %d\n",ans[1].x,ans[1].y);
59     for (i=2;i<=n;i++)
60         if (ans[i].x!=ans[i-1].x) printf("%d %d\n",ans[i].x,ans[i].y);
61     return 0;
62 }
时间: 2024-10-09 21:59:46

[USACO] 铺放矩形块 题解的相关文章

【USACO 1.4.1】铺放矩形块

[描述] 给定4个矩形块,找出一个最小的封闭矩形将这4个矩形块放入,但不得相互重叠.所谓最小矩形指该矩形面积最小. 所有4个矩形块的边都与封闭矩形的边相平行,图1示出了铺放4个矩形块的6种方案.这6种方案是仅可能的基本铺放方案.因为其它方案能由基本方案通过旋转和镜像反射得到. 可能存在满足条件且有着同样面积的各种不同的封闭矩形,你应该输出所有这些封闭矩形的边长. (分类注解:这里的分类依据可以视为是不同的面积计算公式.) [格式] INPUT FORMAT: (file packrec.in)

蓝桥杯题目——瓷砖铺放

问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一共有如下5种铺法: 4=1+1+1+1 4=2+1+1 4=1+2+1 4=1+1+2 4=2+2 编程用递归的方法求解上述问题. 输入格式 只有一个数N,代表地板的长度 输出格式 输出一个数,代表所有不同的瓷砖铺放方法的总数 样例输入 4 样例输出 5 #include<stdio.h> int j

算法训练 瓷砖铺放

时间限制:1.0s   内存限制:512.0MB 问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一共有如下5种铺法: 4=1+1+1+1 4=2+1+1 4=1+2+1 4=1+1+2 4=2+2 编程用递归的方法求解上述问题. 输入格式 只有一个数N,代表地板的长度 输出格式 输出一个数,代表所有不同的瓷砖铺放方法的总数 样例输入 4 样例输出 5 impo

HTML中为何p标签内不可包含div标签?那哪些块元素里面不能放哪些块元素呢?

先看下面的例子你就能明白两者的差别: <p>测试一下块元素与<span>内联元素</span>的差别</p> <p>测试一下<div>块元素</div>与内联元素的差别</p> 在上面的例子中,<div>会自己产生一个新的行,而<span>并没有换行,这是在没有CSS渲染的情况下才这样,同样,我们也可以通过CSS把div定义成内联元素,把span定义成块元素,但是,我们却不能在HTML里

[ALGO-11] 瓷砖铺放

算法训练 瓷砖铺放 时间限制:1.0s   内存限制:512.0MB 问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一共有如下5种铺法: 4=1+1+1+1 4=2+1+1 4=1+2+1 4=1+1+2 4=2+2 编程用递归的方法求解上述问题. 输入格式 只有一个数N,代表地板的长度 输出格式 输出一个数,代表所有不同的瓷砖铺放方法的总数 样例输入 4 样

poj 2411 Mondriaan&#39;s Dream 骨牌铺放 状压dp

题目链接 题意 用\(1\times 2\)的骨牌铺满\(H\times W(H,W\leq 11)\)的网格,问方案数. 思路 参考focus_best. 竖着的骨牌用\(\begin{pmatrix}0\\1\end{pmatrix}\)表示,横着的骨牌用\(\begin{pmatrix}1&1\end{pmatrix}\)表示. 则对于第\(i\)行,与之相容的第\(i-1\)行的状态需满足: 第\(i\)行是0的位置,第\(i-1\)行必须是1: 第\(i\)行是1的位置,第\(i-1\

蓝桥杯--算法训练 瓷砖铺放

问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一共有如下5种铺法: 4=1+1+1+1 4=2+1+1 4=1+2+1 4=1+1+2 4=2+2 编程用递归的方法求解上述问题. 输入格式 只有一个数N,代表地板的长度 输出格式 输出一个数,代表所有不同的瓷砖铺放方法的总数 样例输入 4 样例输出 5分析过程:通过进行递推找出规律 1 12 1+1  23 1

瓷砖铺放(递归)

1 //问题描述 2 // 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 3 // 例如,长度为4的地面一共有如下5种铺法: 4 // 4=1+1+1+1 5 // 4=2+1+1 6 // 4=1+2+1 7 // 4=1+1+2 8 // 4=2+2 9 // 编程用递归的方法求解上述问题. 10 //输入格式 11 // 只有一个数N,代表地板的长度 12 //输出格式 13 //

bzoj usaco 金组水题题解(1)

UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT.............. —————————————————————————————————————————————————————————————————————————————— 写(被虐)了整整一个月b站上usaco的金组题...然而到现在总共只写了100道上下TAT(当然是按AC人数降序排