【USACO 1.4.1】铺放矩形块
【描述】
所有4个矩形块的边都与封闭矩形的边相平行,图1示出了铺放4个矩形块的6种方案。这6种方案是仅可能的基本铺放方案。因为其它方案能由基本方案通过旋转和镜像反射得到。
可能存在满足条件且有着同样面积的各种不同的封闭矩形,你应该输出所有这些封闭矩形的边长。
(分类注解:这里的分类依据可以视为是不同的面积计算公式。)
【格式】
【分析】
对于这道题,我只能说诡异......
实际上,如果把题目中的4个矩形变成n个矩形,这会是一道相当难的题目,但是在题目中给定了限制条件之后,求解变得可能了。
怎么说呢?情况数很多,但是仔细思考后并不是特别难,只是要注意特殊情况。
附参考:http://hi.baidu.com/nash635/item/6619502e7b9020f851fd8701
代码有点丑了......
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
const int maxn=;
using namespace std;
struct matrix
{
int w;
int h;
}data[maxn];
struct Ans
{
int w;
int h;
int s;
bool operator <(const Ans&b) const
{
if (s==b.s) return w<b.w;
return s<b.s;
}
}ans[];
int point=;
void check(matrix a,matrix b,matrix c,matrix d);
int main()
{
int i,a,b,c,d;
int vis[];
//文件操作
freopen("packrec.in","r",stdin);
freopen("packrec.out","w",stdout);
for (i=;i<=;i++)
{
scanf("%d%d",&data[i].w,&data[i].h);
data[i+].w=data[i].h;
data[i+].h=data[i].w;//不同的擺放狀態也應該記作不同的矩形
} for (a=;a<=;a++)
for (b=;b<=;b++)
{
if (a==b) continue;
for (c=;c<=;c++)
{
if (a==c || b==c) continue;
for (d=;d<=;d++)
{
if (a==d || b==d || c==d) continue;
memset(vis,,sizeof(vis));
vis[a]++;vis[b]++;vis[c]++;vis[d]++;
if (vis[]+vis[]>) continue;
if (vis[]+vis[]>) continue;
if (vis[]+vis[]>) continue;
if (vis[]+vis[]>) continue;
check(data[a],data[b],data[c],data[d]);
}
}
} sort(ans,ans+point);
printf("%d\n",ans[].s);
for (i=;i<point;i++)
{
if (i!= && ans[i].s!=ans[i-].s) break;
if (i!= && ans[i].w==ans[i-].w) continue;
printf("%d %d\n",ans[i].w,ans[i].h);
}
return ;
}
void check(matrix a,matrix b,matrix c,matrix d)
{
//枚舉
ans[point].w=a.w+b.w+c.w+d.w;ans[point].h=max(a.h,max(b.h,max(c.h,d.h)));
ans[point].s=ans[point].w*ans[point].h;
if (ans[point].w>ans[point].h) swap(ans[point].w,ans[point].h);
point++;
ans[point].w=max(a.w+b.w+c.w,d.w);ans[point].h=max(a.h,max(b.h,c.h))+d.h;
ans[point].s=ans[point].w*ans[point].h;
if (ans[point].w>ans[point].h) swap(ans[point].w,ans[point].h);
point++;
ans[point].w=max(a.w+b.w,c.w)+d.w;
ans[point].h=max(a.h+c.h,max(b.h+c.h,d.h));
ans[point].s=ans[point].w*ans[point].h;
if (ans[point].w>ans[point].h) swap(ans[point].w,ans[point].h);
point++;
ans[point].w=a.w+b.w+max(c.w,d.w);
ans[point].h=max(a.h,max(c.h+d.h,b.h));
ans[point].s=ans[point].w*ans[point].h;
if (ans[point].w>ans[point].h) swap(ans[point].w,ans[point].h);
point++;
ans[point].h=max(a.h+c.h,b.h+d.h);
if (c.h==d.h) ans[point].w=max(a.w+b.w,c.w+d.w);
if (c.h>=b.h+d.h) ans[point].w=max(a.w,max(c.w+b.w,c.w+d.w));
if (c.h>d.h && c.h<b.h+d.h) ans[point].w=max(a.w+b.w,max(b.w+c.w,c.w+d.w));
if (d.h>c.h && d.h<a.h+c.h) ans[point].w=max(a.w+b.w,max(a.w+d.w,c.w+d.w));
if (d.h>=a.h+c.h) ans[point].w=max(b.w,max(a.w+d.w,c.w+d.w));
ans[point].s=ans[point].w*ans[point].h;
if (ans[point].w>ans[point].h) swap(ans[point].w,ans[point].h);
point++;
}
【USACO 1.4.1】铺放矩形块的更多相关文章
- [USACO] 铺放矩形块 题解
题目大意: 给定4个矩形块,找出一个最小的封闭矩形将这4个矩形块放入,但不得相互重叠.所谓最小矩形指该矩形面积最小. 思路: 枚举矩形的安放顺序,再按照题目所给的图判断即可,主要要想到枚举. 代码: ...
- HTML中为何p标签内不可包含div标签?那哪些块元素里面不能放哪些块元素呢?
先看下面的例子你就能明白两者的差别: <p>测试一下块元素与<span>内联元素</span>的差别</p> <p>测试一下<div& ...
- [ACM_动态规划] 轮廓线动态规划——铺放骨牌(状态压缩1)
Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...
- HDU_2046——骨牌铺放问题,递推
Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: In ...
- ALGO-11_蓝桥杯_算法训练_瓷砖铺放(递归)
问题描述 有一长度为N(<=N<=)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一共有如下5 ...
- C语言 · 瓷砖铺放
算法训练 瓷砖铺放 时间限制:1.0s 内存限制:512.0MB 锦囊1 递归或递推. 问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长 ...
- Educational Codeforces Round 35 B. Two Cakes【枚举/给盘子个数,两份蛋糕块数,最少需要在每个盘子放几块蛋糕保证所有蛋糕块都装下】
B. Two Cakes time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- 算法训练 瓷砖铺放 【递归】java
算法训练 瓷砖铺放 时间限制:1.0s 内存限制:512.0MB 锦囊1 锦囊2 锦囊3 问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为 ...
- Java实现 蓝桥杯VIP 算法训练 瓷砖铺放
[题目描述]: 有一长度为N(1< =N< =10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限.要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的 ...
随机推荐
- 中国linux论坛
linux在国内经过十多年的发展,已慢慢走向成熟.昔日如雨后春笋般成长的linux网站,现在已出现了明显的两极分化.一部分已成长壮大,公司化运作,一部分面临域名出售或关闭的境地. 以笔者经验,以下十 ...
- BZOJ1679: [Usaco2005 Jan]Moo Volume 牛的呼声
1679: [Usaco2005 Jan]Moo Volume 牛的呼声 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 723 Solved: 346[ ...
- Android WebView播放视频flash(判断是否安装flash插件)
Android WebView播放flash(判断是否安装flash插件) 最近帮一个同学做一个项目,断断续续的一些知识点记录一下.一个页面中有一个WebView,用来播放swf,如果系统中未安装f ...
- Android Studio导入Eclipse项目
随着Google 对新Android编辑器Android Studio(以下简称AS)的版本不断更新,越来越多的人开始由熟悉的编辑器Eclipse转向AS,而Eclipse开发团队也坦言将放弃对Ecl ...
- bzoj 1191 [HNOI2006]超级英雄Hero(最大基数匹配)
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2813 Solved: 1331[Submit][ ...
- qemu kvm 虚拟化
虚拟化: KVM是一个基于Linux内核的虚拟机,属于完全虚拟化.虚拟机监控的实现模型有两类:监控模型(Hypervisor)和宿主机模型(Host-based).由于监控模型需要进行处理器调度,还需 ...
- 移动端解决fixed和input获取焦点软键盘弹出影响定位的问题
场景描述, 当document的高度不够window的高度时候,如在ip6中文档的高度比窗体的高度小,到底设计在最下方的区域没有在窗体最下方,就留有空白地方如下图的灰色部分 1. 解决初始化文档高度, ...
- DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试
1.测试环境: 硬件环境: 数据库服务器:2U*8核 8G内存 测试服务器: 2U*8核 6G内存 软件环境: jdk: 1.6.29 mysql: 5.0.77 mysql_driver: my ...
- 《JS原型》
@(JavaScript原型) JavaScript中最晦涩难懂的恐怕就是原型了.故以此笔记本来记录原型的学习过程,日后忘了可来温习. 一切皆为对象 null--Object&Function ...
- STL——increment/decrement/dereference操作符
increment/dereference操作符在迭代器的实现上占有非常重要的地位,因为任何一个迭代器都必须实现出前进(increment,operator++)和取值(dereference,ope ...