Posted on 2010-10-18 17:05
李东亮 阅读(143)
评论(0) 编辑 收藏 引用 所属分类:
acm
ZOJ 1178 Booklet Printing
这道题是一道简单的模拟题,但是做起来有点繁琐,不仅处理过程繁琐,输出也繁琐。这个问题大意是打印文章,双面打印,一面打印两页,给定页数,然后输出每页纸打印的页码。要求这些纸放在一起,从中间折叠后,页码连续递增。找两张纸一试就知道怎么回事了。用front[0]、front[1]分别表示正面打印的页码数,back[0]、back[1]表示背面打印的页码数。对于4页的文章,毫无疑问front[1]
= 1;back[0]=2;back[1]=3;front[0]=4。在输出的时候back与冒号之间有空格,而front与冒号之间无空格,开始还以为是题目打错了,自作聪明的该了下,提交就WA了,后来改过来一看,原来是多打个空格是因为front比back多个字母,为了对齐好看。需要注意的是首页或者最后一页有可能有空白页,需要额外处理。
参考代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int front[2];
int back[2];
}a[25];
int main(void)
{
int n;
int i;
int pages;
int t;
while (scanf("%d", &n) != EOF && n != 0)
{
pages = n/4;
if (n%4 != 0)
++pages;
t = 0;
memset(a, 0, sizeof(a));
for (i = 0; i < pages-1; ++i)
{
++t;
a[i].front[1] = t;
++t;
a[i].back[0] = t;
}
if (n > t)
{
++t;
a[i].front[1] = t;
}
if (n > t)
{
++t;
a[i].back[0] = t;
}
i = pages - 1;
while (n > t+1)
{
++t;
a[i].back[1] = t;
++t;
a[i].front[0] = t;
--i;
}
if (n > t)
{
++t;
a[i].back[1] = t;
}
if (n > t)
{
++t;
a[i].front[0] = t;
}
printf("Printing order for %d pages:\n", n);
for (i = 0; i < pages-1; ++i)
{
printf("Sheet %d, front: ", i+1);
if (a[i].front[0] == 0)
{
printf("%s, ", "Blank");
}
else
{
printf("%d, ", a[i].front[0]);
}
if (a[i].front[1] == 0)
{
printf("%s\n", "Blank");
}
else
{
printf("%d\n", a[i].front[1]);
}
printf("Sheet %d, back : ", i+1);
if (a[i].back[0] == 0)
{
printf("%s, ", "Blank");
}
else
{
printf("%d, ", a[i].back[0]);
}
if (a[i].back[1] == 0)
{
printf("%s\n", "Blank");
}
else
{
printf("%d\n", a[i].back[1]);
}
}
if (a[i].front[0] != 0 || a[i].front[1] != 0)
{
printf("Sheet %d, front: ", i+1);
if (a[i].front[0] == 0)
{
printf("%s, ", "Blank");
}
else
{
printf("%d, ", a[i].front[0]);
}
if (a[i].front[1] == 0)
{
printf("%s\n", "Blank");
}
else
{
printf("%d\n", a[i].front[1]);
}
}
if (a[i].back[0] != 0 || a[i].back[1] != 0)
{
printf("Sheet %d, back : ", i+1);
if (a[i].back[0] == 0)
{
printf("%s, ", "Blank");
}
else
{
printf("%d, ", a[i].back[0]);
}
if (a[i].back[1] == 0)
{
printf("%s\n", "Blank");
}
else
{
printf("%d\n", a[i].back[1]);
}
}
}
return 0;
}