news 2026/7/9 7:39:11

UVa 637 Booklet Printing

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 637 Booklet Printing

题目描述

在打印文档时,通常按顺序打印第一页、第二页……但若要制作折叠小册子(booklet\texttt{booklet}booklet),打印顺序必须改变。一本折叠小册子每张纸包含四个页面:正面两张、背面两张。将所有纸张按顺序堆叠后,从中间对折,页面顺序就会像普通书籍一样正确。例如,一本444页的小册子只需111张纸:正面包含第444页和第111页,背面包含第222页和第333页。

给定总页数nnnn≤100n \le 100n100),要求生成每张纸正反面的打印顺序。若某些页面位置为空,则输出Blank。若某张纸的正面或背面完全空白,则不输出该面。输出按纸张编号升序,先正面后反面。

输入格式

输入包含一个或多个测试用例,每行一个正整数nnn,以单独一行0表示结束。

输出格式

对于每个测试用例,输出报告,格式如样例所示。若某面完全空白,则不输出该面。

样例

输入

1 14 4 0

输出

Printing order for 1 pages: Sheet 1, front: Blank, 1 Printing order for 14 pages: Sheet 1, front: Blank, 1 Sheet 1, back: 2, Blank Sheet 2, front: 14, 3 Sheet 2, back: 4, 13 Sheet 3, front: 12, 5 Sheet 3, back: 6, 11 Sheet 4, front: 10, 7 Sheet 4, back: 8, 9 Printing order for 4 pages: Sheet 1, front: 4, 1 Sheet 1, back: 2, 3

题目分析

小册子打印的实质是:将nnn个页码按特定顺序分配到若干张纸的正反面上,使得最终堆叠对折后页码连续且正确。每张纸可容纳444个页码位置:正面左侧、正面右侧、背面左侧、背面右侧。通常的排列方式为:从外向内,页码按降序分配在正面左侧和背面右侧,按升序分配在正面右侧和背面左侧。

参考代码采用构造法:首先确定需要多少张纸,然后按顺序填充正面右侧和背面左侧(即内页的升序部分),再从后向前填充正面左侧和背面右侧(即外页的降序部分)。最后输出时,若某面完全空白则跳过。

解题思路

  1. 计算纸张数:设纸张数为sheet_number,满足4×sheet_number≥n4 \times \textit{sheet\_number} \ge n4×sheet_numbern,且4×(sheet_number−1)<n4 \times (\textit{sheet\_number}-1) < n4×(sheet_number1)<n,即sheet_number=⌈n/4⌉\textit{sheet\_number} = \lceil n/4 \rceilsheet_number=n/4。代码中用循环递增sheet_number直到4×sheet_number≥n4 \times \textit{sheet\_number} \ge n4×sheet_numbern

  2. 初始化纸张结构:每个纸张有四个位置:front_leftfront_rightback_leftback_right,初始均为000(表示空白)。

  3. 填充升序页码(右侧和背面左侧):对于第iii张纸(iii000开始):

    • 正面右侧(front_right)赋值为2i+12i+12i+1
    • 2i+2≤n2i+2 \le n2i+2n,则背面左侧(back_left)赋值为2i+22i+22i+2
      这样从左到右,正面右侧依次为1,3,5,…1, 3, 5, \dots1,3,5,,背面左侧依次为2,4,6,…2, 4, 6, \dots2,4,6,,即填充了前2×sheet_number2 \times \textit{sheet\_number}2×sheet_number个页码。
  4. 填充降序页码(正面左侧和背面右侧):若还有剩余页码(即n>2×sheet_numbern > 2 \times \textit{sheet\_number}n>2×sheet_number),则从最后一张纸开始向前填充:

    • 背面右侧(back_right)赋值为下一个未分配的页码(从2×sheet_number+12 \times \textit{sheet\_number}+12×sheet_number+1开始递增)。
    • 若还有剩余,则正面左侧(front_left)赋值为再下一个未分配的页码。
    • 更新纸张索引向前移动,继续填充,直到所有页码分配完毕。
  5. 输出:按纸张顺序输出每张纸的正面和背面(若正面非全空)。输出格式需严格遵循样例,注意空格和标点。

复杂度分析

  • 纸张数最多⌈100/4⌉=25\lceil 100/4 \rceil = 25100/4=25,因此算法常数级。
  • 时间复杂度O(1)O(1)O(1),空间复杂度O(1)O(1)O(1)

代码实现

// Booklet Printing// UVa ID: 637// Verdict: Accepted// Submission Date: 2016-08-26// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structsheet{intfront_left,front_right,back_left,back_right;};intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);sheet sheets[100];intn;while(cin>>n,n){memset(sheets,0,sizeof(sheets));intsheet_number=0;do{sheets[sheet_number].front_right=2*sheet_number+1;if(2*sheet_number+2<=n)sheets[sheet_number].back_left=2*sheet_number+2;sheet_number++;}while(4*sheet_number<n);inttotal_sheets=sheet_number,total_pages=2*sheet_number;while(total_pages<n){sheets[total_sheets-1].back_right=total_pages+1;total_pages++;if(total_pages<n){sheets[total_sheets-1].front_left=total_pages+1;total_pages++;}total_sheets--;}cout<<"Printing order for "<<n<<" pages:\n";for(inti=0;i<sheet_number;i++){cout<<"Sheet "<<i+1<<", front: ";if(sheets[i].front_left==0)cout<<"Blank";elsecout<<sheets[i].front_left;cout<<", "<<sheets[i].front_right<<'\n';if(sheets[i].back_left==0&&sheets[i].back_right==0)continue;else{cout<<"Sheet "<<i+1<<", back : ";cout<<sheets[i].back_left<<", ";if(sheets[i].back_right==0)cout<<"Blank\n";elsecout<<sheets[i].back_right<<'\n';}}}return0;}

总结

本题通过构造法直接生成小册子打印顺序,无需复杂的搜索或模拟。关键在于理解每张纸正反面的页码排列规律:内页按升序填充右侧,外页按降序填充左侧。代码利用数组存储每个位置,按步骤填充后再统一输出,逻辑清晰。输出时注意处理完全空白的面,避免多余输出。此方法适用于nnn不超过100100100的小规模数据,且效率极高。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 7:37:08

STM32L152ZD与AD5593R的硬件设计与通信优化

1. AD5593R与STM32L152ZD的硬件协同设计AD5593R作为ADI公司推出的多功能数据转换器&#xff0c;其8通道可配置为ADC或DAC的特性为嵌入式系统提供了极大的灵活性。在实际项目中&#xff0c;我选择将其与STM32L152ZD这款低功耗MCU搭配使用&#xff0c;主要基于以下硬件设计考量&a…

作者头像 李华
网站建设 2026/7/9 7:36:54

PyTorch 模型昇腾 NPU 迁移:3 种代码适配方法与混合精度训练实测

PyTorch模型昇腾NPU迁移实战&#xff1a;3种代码适配方法与混合精度训练深度解析当深度学习开发者面临从NVIDIA GPU向昇腾NPU平台迁移模型时&#xff0c;往往需要跨越硬件架构差异、软件栈兼容性以及性能优化等多重挑战。本文将系统性地拆解三种主流迁移方法&#xff0c;并通过…

作者头像 李华
网站建设 2026/7/9 7:32:13

计算机毕业设计之基于SSM框架的网上购物系统

随着互联网技术的飞速发展&#xff0c;电子商务已成为现代商业模式的重要组成部分。网上购物系统作为电子商务的核心应用之一&#xff0c;极大地便利了人们的购物方式&#xff0c;提高了购物效率。为了满足日益增长的在线购物需求&#xff0c;本文设计并实现了一个基于SSM框架的…

作者头像 李华
网站建设 2026/7/9 7:31:33

【Qt初识】信号槽(一):核心概念与 connect 的使用

大家好&#xff0c;我是Halcyon.平安 欢迎文末添加好友交流&#xff0c;共同进步&#xff01; 目录一、信号和槽概念1.1概述1.2 本质1.3 理解 二、信号和槽的使用三、如何知道内置信号与槽有哪些 & 深入理解 connect3.1 学会使用官方文档3.2 connect参数类型解释 目录 一、…

作者头像 李华
网站建设 2026/7/9 7:30:56

《PCI Express体系结构导读16》-- 虚拟化技术

1. 虚拟化技术一般指多个进程共享一个cpu,多个进程的虚拟空间共享同一个物理内存等; 本章所说的虚拟化技术是指在一个处理器系统中运行多个虚拟处理器系统,其中每个虚拟处理器系统都有独立的虚拟运行环境,包括cpu,内存和外部设备;虽然他们彼此独立,但是仍然可以使用相同…

作者头像 李华