USTC OJ — 1005 Booklet Printing(找规律,简单题)

1. 题目描述

本题的描述比较凌乱,不过题目给出的测试数据比较好,可以推测出题目的意思。

下面是题目给出的测试数据:

2. 算法设计

每一张纸可以印4页,从第一张纸开始往后遍历,分别设置每张纸上需要印制的页码即可。

以第二组测试数据为例:

共需要印刷的页数n = 14,那需要的纸张数sheet_num = n / 4 + 1 = 4。

sheet_num = 4时,共可以印4*4 = 16页。实际只需要印14页,那就有两页空着,需要印上Black。

观察相邻的两页纸上印刷的页码,如下:

页码从前数1,2,。。。

页码从后数16,15,(前面两个>14,直接输出Black)14,。。。

每次循环一张纸(4个页码),如果当前第2张纸已经印刷完了,如下:

下面开始印刷第三张纸:

首先front: r_page = 12, l_page = 5   (r_page--, l_page++)

然后back:   l_page = 6  , r_page = 11 (r_page--, l_page++)

后面依次下去。。。

3. AC Code

 1 #include <stdio.h>
 2
 3 void ac_fun(int n);
 4 int main()
 5 {
 6     int n;
 7     // freopen("in.txt", "r", stdin);
 8     while ( scanf("%d", &n) != EOF && 0 != n )
 9     {
10         printf("Printing order for %d pages:\n", n);
11         ac_fun(n);
12     }
13     return 0;
14 }
15
16 void ac_fun(int n)
17 {
18     int i;
19     int l_page, r_page;
20     int sheet_num;
21     int l_board, r_board;
22     if ( n % 4 == 0 )
23         sheet_num = n / 4;
24     else
25         sheet_num = n / 4 + 1;
26
27     l_board = 1;
28     r_board = sheet_num * 4;
29
30     // 从前往后,遍历每一张纸
31     for ( i = 1; i <= sheet_num; i++ )
32     {
33         // sheet‘s front
34         if ( r_board > n )
35             l_page = 0;
36         else
37             l_page = r_board;
38         r_page = l_board;
39         l_board++;
40         r_board--;
41         if ( l_page == 0 )
42             printf("Sheet %d, front: Blank, %d\n", i, r_page);
43         else
44             printf("Sheet %d, front: %d, %d\n", i, l_page, r_page);
45
46         if ( r_page >= n ) break;
47
48         // sheet‘s back
49         if ( r_board > n  )
50             r_page = 0;
51         else
52             r_page = r_board;
53         l_page = l_board;
54         l_board++;
55         r_board--;
56         if ( r_page == 0 )
57             printf("Sheet %d, back : %d, Blank\n", i, l_page);
58         else
59             printf("Sheet %d, back : %d, %d\n", i, l_page, r_page);
60     }
61 }

时间: 2024-10-29 19:10:41

USTC OJ — 1005 Booklet Printing(找规律,简单题)的相关文章

USTC OJ — 1003 Fibonacci Numbers(组合数学, 简单题)

1. 题目描述 Fibonacci数列定义为: A0 = 0, A1 = 1; An = An-1 + An-2, if n >= 2. 问题:输入一个n( 0 ≤ n ≤ 40 ),计算An. 2. 算法设计 直接利用公式计算即可,时间复杂度O(N),由于数据规模很小,可以选择 先打表,然后对每一个测试数据n,直接输出An: 或者分别对每一个n,计算An. 3. AC Code 1 #include <stdio.h> 2 #define N 41 3 int f[N]; 4 void

长春理工大学第十四届程序设计竞赛F Successione di Fixoracci——找规律&amp;&amp;水题

题目 链接 题意:给出x数列的定义: $T_0 = a$ $T_1 = b$ $T_n = T_{n-2} \bigoplus T_{n-1} $ 求第 $n$ 项( $0 \leqslant a,b,c \leqslant 10^{18} $) 分析 $n$ 这么大,肯定是常数时间复杂度. 打表找规律,能发现循环节为3. 或者直接推导,$a \bigoplus b = c, \ b \bigoplus c = a, \ c \bigoplus a = b$ #include<bits/stdc

[Swust OJ 179]--火柴棍(找规律)

题目链接:http://acm.swust.edu.cn/problem/0179/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 火柴棍可以拼成10进制的数字,如图所示: 现在,gogo给你个n个火柴棍,要求你输出最小能拼成的数字和最大能拼成的数字. Input 第一行输入一个整数T:T组测试数据(T<100) 每行输入一个n (2 ≤ n ≤ 100): 表示你有的火柴棍数. Output 最小能拼成的数字和最大能拼成的数字

[Swust OJ 552]--拼音教学(找规律)

题目链接:http://acm.swust.edu.cn/problem/0552/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 数钱啦~~~输入一个数字,小于999999999999,我们需要把他们转换为拼音,我们规定例如1234000567的念为“1十2亿3千4百万零5百6十7”具体见输入输出 Input 一个数字N Output 数字加拼音,见SAMPLE OUTPUT Sample Input 999999999999

hdu 1005 递归超限 找规律

因为n>1000000000所以用递归 数组超限, 由递归函数f(n)=(A*f(n-1)+B*f(n-2))%7; 因为是除7的余数 因次一共有7*7=49种情况, 以后的值都和之前的对应相等 所以找到和3,4 重复的数之后,就很容易得到f(n)

HDU 5703 Desert 水题 找规律

已知有n个单位的水,问有几种方式把这些水喝完,每天至少喝1个单位的水,而且每天喝的水的单位为整数.看上去挺复杂要跑循环,但其实上,列举几种情况之后就会发现是找规律的题了= =都是2的n-1次方,而且这题输出二进制数就行了......那就更简单了,直接输出1,然后后面跟n-1个0就行了╮(╯_╰)╭ 下面AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>

Codeforces Round #242 (Div. 2)C(找规律,异或运算)

一看就是找规律的题.只要熟悉异或的性质,可以秒杀. 为了防止忘记异或的规则,可以把异或理解为半加运算:其运算法则相当于不带进位的二进制加法. 一些性质如下: 交换律: 结合律: 恒等律: 归零律: 典型应用:交换a和b的值:a=a^b^(b=a); #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<

ZOJ 3629(找规律)

Treasure Hunt IV Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is exploring the wonderland, suddenly she fell into a hole, when she woke up, she found there are b - a + 1 treasures labled afrom b in front of her. Alice was very excited but

【UVA】11040 - Add bricks in the wall(找规律)

一道找规律的题,可以看出,大的三角形可以划分成好多个三层的三角形: [x] [a][x-a] [y] [    ][z] 这里面xyz都已知,所以可以求出a = (x + y - z ) /2 14043615 11040 Add bricks in the wall Accepted C++ 0.019 2014-08-15 06:02:50 #include<cstdio> #include<cstring> #include<iostream> #include&