首页 > 代码库 > USTC OJ — 1005 Booklet Printing(找规律,简单题)
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 else25 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 front34 if ( r_board > n )35 l_page = 0;36 else37 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 else44 printf("Sheet %d, front: %d, %d\n", i, l_page, r_page);45 46 if ( r_page >= n ) break;47 48 // sheet‘s back49 if ( r_board > n )50 r_page = 0;51 else52 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 else59 printf("Sheet %d, back : %d, %d\n", i, l_page, r_page);60 }61 }
USTC OJ — 1005 Booklet Printing(找规律,简单题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。