hdu 1117 Booklet Printing(模拟 分类 水题)

本文介绍了一种打印页码的特殊排列算法,用于模拟多页文档打印时的纸张翻阅顺序。通过实例演示了不同页数情况下打印页码的具体布局,并提供了C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

http://acm.hdu.edu.cn/showproblem.php?pid=1117


首先上图,

这表示三张纸订正一本册子的姿势,是一张夹着一张的,明白了这个,就可以水过去了。

这里第一面是12,1

第二面是2,11

第三面(第二张纸)是10,3

......这其实是打印纸张时打印的顺序。


当页码是1的时候,只用输出第一面就行了,情况为  Blank,1(第二面是空白的不用输)

当页码是2的时候,输出的应该是

Blank,1

2,Blank(其实把这个填到最上面的那个图里就能理解了,12和11换成Blank,符合我们翻书的规则)

然后当页码为5的时候,它是这样的:

Blank, 1
2, Blank
Blank, 3
4, 5(为什么是这样,同理,填进去就知道了,你也可以把你自己认为对的填进去检查下)

页码为7的时候是这样的:

Blank, 1
2, 7
6, 3
4, 5

......总之,你打印一页的内容,至少要耗费一张纸(4页)

下面是我的代码,分类来做的,比较弱的代码,结尾有一个思路清晰的代码的链接。

#include<cstdio>
#include<iostream>
using namespace std;
int data[105];
int main()
{
	int n,num,i,ant;
	while(cin>>num,num!=0)
	{
//		cin>>num;
		for(i=1;i<=num;i++)
			data[i]=i;
		ant=1;
		printf("Printing order for %d pages:\n",num);
		
			if(num%2!=0)//奇数 
			{
				int left=2;//第一组情况特殊,总是单独处理,所以左边界从2开始 
				int right=num;
				if(num>1)// 
				{
					if((num+1)/2%2!=0)//5,9,13... 奇数为前面这些数的时候,单独处理,保证页数 
					{
						printf("Sheet 1, front: Blank, 1\n");
						printf("Sheet 1, back : 2, Blank\n");
						printf("Sheet 2, front: Blank, 3\n");
						left=4;
						right=num;
						printf("Sheet 2, back : %d, %d\n",data[left++],data[right--]);
						ant+=2;
					}
				}
				while(left<right||ant==1)//这里可以顺便处理下只有1页的特殊情况 
				{
					
					if(ant==1)
						printf("Sheet %d, front: Blank, %d\n",ant,1);
					else
						printf("Sheet %d, front: %d, %d\n",ant,data[right--],data[left++]);
					if(left<right)//甄别普通情况和只有1页的情况 
						printf("Sheet %d, back : %d, %d\n",ant,data[left++],data[right--]);
					ant++;
				}
				
			}
			else//偶数 
			{
				int left=1;
				int right=num;
				if(num/2%2!=0)//2,6,10... 
				{
					printf("Sheet %d, front: Blank, %d\n",ant,1);
					printf("Sheet %d, back : %d, Blank\n",ant,2);
					left=3;
				}
				else//4,8,12... 
				{
					printf("Sheet %d, front: %d, %d\n",ant,data[right--],data[left++]);
					printf("Sheet %d, back : %d, %d\n",ant,data[left++],data[right--]);
				}
				ant++;
				while(left<right)
				{
					printf("Sheet %d, front: %d, %d\n",ant,data[right--],data[left++]);
					printf("Sheet %d, back : %d, %d\n",ant,data[left++],data[right--]);
					ant++;
				}
			}
		 
	}
	return 0;
}


http://www.cnblogs.com/dramstadt/archive/2013/08/15/3260652.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值