这道题卡了很久,开始没读清楚题,没看到题目中给的6个组合是仅可能的组合,一直自己想有多少种组合方式。后来才发现,于是就想到写遍历。我想的是,这六种情况下,每个位置摆哪个矩形是不确定的,于是可以对方块的排列方法遍历,对每个方块是横放还是竖放遍历。写了一个9层的循环,效率很低,有非常多的重复。不过通过了。

#include <stdio.h>
#include <stdlib.h>
#include <math.h> typedef struct
{
int x;
int y;
}RECTANGLE; typedef struct
{
RECTANGLE r[];
}RECRotate; int cmp(const void *a1, const void *a2)
{
return ((RECTANGLE *)a1)->x - ((RECTANGLE *)a2)->x;
} int max(int a, int b)
{
return a > b ? a : b;
}
int min(int a, int b)
{
return a < b ? a : b;
} int assem(int c, RECTANGLE r1, RECTANGLE r2, RECTANGLE r3, RECTANGLE r4, RECTANGLE *out)
{
switch(c)
{
case :
out->x = r1.x + r2.x + r3.x + r4.x;
out->y = max(r4.y, max(r3.y, max(r1.y, r2.y)));
break;
case :
out->x = max(r4.y, r1.x + r2.x + r3.x);
out->y = max(r3.y, max(r1.y, r2.y)) + r4.x;
break;
case :
out->x = max(r1.x + r2.x + r3.x, r3.x + r4.y);
out->y = max(r1.y + r4.x, max(r3.y, r2.y + r4.x));
break;
case : //basic 4 and basic 5 have the same area
out->x = max(r2.x, r3.x) + r1.x +r4.x;
out->y = max(r2.y + r3.y, max(r1.y, r4.y));
break;
case :
if(r3.y >= r4.y)
{
out->x = max(r2.y + r3.x, max(r3.x + r4.x, r1.x + r2.y));
out->y = max(r1.y + r3.y, r2.x + r4.y);
}
break;
default:
break;
}
return ;
} int isfirst(RECTANGLE *outr, int num, RECTANGLE tmp) //判断答案是否第一次出现 因为计算有冗余 可能有相同答案出现多次
{
int i;
for(i = ; i < num; i++)
{
if(tmp.x == outr[i].x || tmp.y == outr[i].x)
{
return ;
}
}
return ;
}
int main()
{
FILE *in, *out;
RECRotate recin[]; //原始输入矩阵
RECTANGLE outr[]; int i, j[], k[];
in = fopen("packrec.in", "r");
out = fopen("packrec.out", "w"); for(i = ; i < ; i++)
{
fscanf(in, "%d %d", &recin[i].r[].x, &recin[i].r[].y);
recin[i].r[].x = recin[i].r[].y;
recin[i].r[].y = recin[i].r[].x;
} RECTANGLE R1;
RECTANGLE R2;
RECTANGLE R3;
RECTANGLE R4;
RECTANGLE OUTTMP;
int minarea = ;
int outnum = ;
for(j[] = ; j[] < ; j[]++) //对每个位置采用第几个方块遍历
{
for(j[] = ; j[] < ; j[]++)
{
if(j[] == j[]) continue;
for(j[] = ; j[] < ; j[]++)
{
if(j[] == j[] || j[] == j[]) continue;
for(j[] = ; j[] < ; j[]++)
{
if(j[] == j[] || j[] == j[] || j[] == j[]) continue;
for(k[] = ; k[] < ; k[]++)
{
for(k[] = ; k[] < ; k[]++) //对每个方块采用横放竖放遍历
{
for(k[] = ; k[] < ; k[]++)
{
for(k[] = ; k[] < ; k[]++)
{
R1 = recin[j[]].r[k[]];
R2 = recin[j[]].r[k[]];
R3 = recin[j[]].r[k[]];
R4 = recin[j[]].r[k[]];
for(i = ; i < ; i++) //对6种情况遍历
{
assem(i, R1, R2, R3, R4, &OUTTMP);
if(OUTTMP.x * OUTTMP.y < minarea)
{
minarea = OUTTMP.x * OUTTMP.y;
outnum = ;
outr[outnum - ] = OUTTMP;
}
else if(OUTTMP.x * OUTTMP.y == minarea && isfirst(outr, outnum, OUTTMP))
{
outnum++;
outr[outnum - ] = OUTTMP;
}
}
}
}
}
}
}
}
}
}
for(i = ; i < outnum; i++) //令短边长在前
{
if(outr[i].x > outr[i].y)
{
int tmp = outr[i].x;
outr[i].x = outr[i].y;
outr[i].y = tmp;
}
}
qsort(outr, outnum, sizeof(outr[]), cmp); //按照短边长从小到大输出 fprintf(out, "%d\n", minarea);
for(i = ; i < outnum; i++)
{
fprintf(out, "%d %d\n", outr[i].x, outr[i].y);
} return ;
}

【USACO】packrec的更多相关文章

  1. POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)

    POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...

  2. 1642: 【USACO】Payback(还债)

    1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...

  3. 1519: 【USACO】超级书架

    1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...

  4. Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers

    [USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...

  5. 【CPLUSOJ】【USACO】【差分约束】排队(layout)

    [题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...

  6. 【USACO】Dining

    [题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...

  7. 【USACO】Optimal Milking

    题目链接 :        [POJ]点击打开链接        [caioj]点击打开链接 算法 : 1:跑一遍弗洛伊德,求出点与点之间的最短路径 2:二分答案,二分”最大值最小“ 3.1:建边,将 ...

  8. 【USACO】 Balanced Photo

    [题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...

  9. 【USACO】 Balanced Lineup

    [题目链接] 点击打开链接 [算法] 这是一道经典的最值查询(RMQ)问题. 我们首先想到线段树.但有没有更快的方法呢?对于这类问题,我们可以用ST表(稀疏表)算法求解. 稀疏表算法.其实也是一种动态 ...

随机推荐

  1. 洛谷P1203 [USACO1.1]坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  2. [IOS 同步GET和POST数据的模版]

    1.同步GET (联网检测) +(BOOL)checkConnect{ // 初始化请求 NSMutableURLRequest *request = [[NSMutableURLRequest al ...

  3. UVA12563Jin Ge Jin Qu hao(01背包)

    紫书P274 题意:输入N首歌曲和最后剩余的时间t,问在保证能唱的歌曲数目最多的情况下,时间最长:最后必唱<劲歌金曲> 所以就在最后一秒唱劲歌金曲就ok了,背包容量是t-1,来装前面的歌曲 ...

  4. C#实现通过程序自动抓取远程Web网页信息的代码

    http://www.jb51.net/article/9499.htm 通过程序自动的读取其它网站网页显示的信息,类似于爬虫程序.比方说我们有一个系统,要提取BaiDu网站上歌曲搜索排名.分析系统在 ...

  5. JS触发事件大全

          事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown IE4.N4 按下鼠 ...

  6. PHP 与网址相关内容

    在PHP中,有时需要知道脚本所处的位置,这时会用到$_SERVER['SCRIPT_NAME'].$_SERVER['SCRIPT_FILENAME']及__FILE__.那么他们之间有什么不同呢? ...

  7. Linux下memcache的安装和启动(转)

    memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.据说官方所说,其用户包括twitter.digg.flickr等,都是些互联网大腕呀.目前用memca ...

  8. python -os、sys

    个人还不是很懂 os操作文件目录.sys针对系统环境的交互.大概是这样 使用os.system函数运行其他程序 os模块中的system()函数可以方便地运行其他程序或者脚本.其函数原型如下所示. o ...

  9. js Float 精度

    1.加法 //加法 function add(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].lengt ...

  10. 简单的分页存储过程,Json格式日期转换为一般日期

    简单的分页存储过程 CREATE PROC Paged @pageIndex INT, @pageCount INT OUTPUT, @pageSize INT AS DECLARE @count I ...