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