信息学 (计算机) 奥林匹克训练题 (中级部分)

信息学 (计算机) 奥林匹克训练题 (中级部分)

天津师范大学   李学武        1997.7.

1.  给定等式  A B C D E     其中每个字母代表一个数字,且不同数字对应不
                    D F G     同字母。编程求出这些数字并且打出这个数字的
             +      D F G     算术计算竖式。

             ───────

                X Y Z D E



  2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
  人参加了竞赛:

   (1)A参加时,B也参加;

   (2)B和C只有一个人参加;

   (3)C和D或者都参加,或者都不参加;

   (4)D和E中至少有一个人参加;

   (5)如果E参加,那么A和D也都参加。



  3. 打印一个 N*N 的方阵,N为每边           N=15  打印出下面图形
 字符的个数(3<N<20), 要求最               TTTTTTTTTTTTTTT
 外一层为"T", 第二层为"J", 从第三层               TJJJJJJJJJJJJJT
 起每层依次打印数字 1,2,3,...                     TJ11111111111JT
 (右图以N为15为例)                           TJ12222222221JT
                                                  TJ12333333321JT
                                                  TJ12344444321JT
                                                  TJ12345554321JT
                                                  TJ12345654321JT
                                                  TJ12345554321JT
                                                  TJ12344444321JT
                                                  TJ12333333321JT
                                                  TJ12222222221JT
                                                  TJ11111111111JT
                                                  TJJJJJJJJJJJJJT
                                                  TTTTTTTTTTTTTTT



  4. 在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅
  出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。
  编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。

        1  2  3  4  5
        2  3  4  5  1
        3  4  5  1  2
        4  5  1  2  3
        5  1  2  3  4


  5. 输入一个十进数,将其转换成 N 进制数(0

 6. 矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数:

   ① 倒填,例如N=5             ② 蛇形填数              ③ 回转填数

 ┌─┬─┬─┬─┬─┐   ┌─┬─┬─┬─┬─┐   ┌─┬─┬─┬─┬─┐
 │25│24│23│22│21│   │ 1│ 3│ 4│10│11│   │ 1│16│15│14│13│
 ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
 │20│19│18│17│16│   │ 2│ 5│ 9│12│19│   │ 2│17│24│23│12│
 ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
 │15│14│13│12│11│   │ 6│ 8│13│18│20│   │ 3│18│25│22│11│
 ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
 │10│ 9│ 8│ 7│ 6│   │ 7│14│17│21│24│   │ 4│19│20│21│10│
 ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤   ├─┼─┼─┼─┼─┤
 │ 5│ 4│ 3│ 2│ 1│   │15│16│22│23│25│   │ 5│ 6│ 7│ 8│ 9│
 └─┴─┴─┴─┴─┘   └─┴─┴─┴─┴─┘   └─┴─┴─┴─┴─┘


  7. 读入一行文本,包含若干个单词(以空格间隔,%结尾)。将其中以 A 开头的
  单词与以 N 结尾的单词,用头尾交换的办法予以置换。



  8. 输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进
  制加法运算,再将结果化为十进制数输出。



  9. 四人玩火柴棍游戏,每一次都是三个人赢,一个人输。输的人要按赢者手中的火柴
  数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根。现知道玩过四次后,
  每人恰好输过一次, 而且每人手中都正好有16根火柴。问此四人做游戏前手中各有
  多少根火柴? 编程解决此问题。



 10. 如图1所示,编写程序计算               ┎┰┰┰┰┰┰┰┰┰┒
    大大小小正方形共有多少?当最小          ┠╂╂╂╂╂╂╂╂╂┨
    正方行边长为1时,它们的总面积          ┠╂╂╂╂╂╂╂╂╂┨
    共为多少?                              ┠╂╂╂╂╂╂╂╂╂┨
                                            ┠╂╂╂╂╂╂╂╂╂┨
                                            ┠╂╂╂╂╂╂╂╂╂┨
                                            ┠╂╂╂╂╂╂╂╂╂┨
                                            ┠╂╂╂╂╂╂╂╂╂┨
                                            ┠╂╂╂╂╂╂╂╂╂┨
                                            ┠╂╂╂╂╂╂╂╂╂┨
                                            ┖┸┸┸┸┸┸┸┸┸┚

11. 巧排数字。将1、2、...、20这20个数排成一排,使得相邻的两个数之
  和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。



 12. 下图是一个集装箱仓库,阴影部分表示有集装箱存放不能通过,无阴影处为临时通
 道。当有人要从入口处到达出口处时,必须寻找可通过路线,请你找出可完成这个过程
 的最方便(即用最短路线)到达出口处的路径。

          ┎┰┰┰入口┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┰┒
          ┠╂╂╂──╂╂╂╂┸┸╂┸┸╂┸┸╂┸┸╂╂╂╂┸┸╂╂╂┨
          ┠╂╂╂──╂┸┸╂──╂┰┰╂┰┰╂──╂╂╂╂──╂╂╂┨
          ┠╂╂╂──╂┰┰╂┰┰╂╂╂╂╂╂╂──╂┸┸╂──╂╂╂┨
          ┠╂╂╂──╂╂╂╂╂╂╂╂╂╂╂╂╂┰┰╂┰┰╂┰┰╂╂╂┨
          ┠╂╂╂──╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂┸┸╂╂╂┨
          ┠╂╂╂──╂┰┰╂┰┰╂┰┰╂──╂┰┰╂──╂┰┰╂╂╂┨
          ┠╂╂╂──╂╂╂╂╂╂╂╂╂╂──╂╂╂╂──╂╂╂╂╂╂┨
          ┠╂╂╂──╂╂╂╂┸┸╂┸┸╂──╂╂╂╂──╂┸┸╂╂╂┨
          ┠╂╂╂──╂╂╂╂┰┰╂┰┰╂┰┰╂╂╂╂┰┰╂──╂╂╂┨
          ┖┸┸┸──┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸┸出口┸┸┸┚


 13. 有N个硬币(N为偶数)正面朝上排成一排,每次将 N-1 个硬币翻过来放在原位
 置, 不断地重复上述过程,直到最后全部硬币翻成反面朝上为止。编程让计算机把
 翻币的最简过程及翻币次数打印出来(用*代表正面,O 代表反面)。



 14. 有黑白棋子各有N个(分别用*和O代替),按下图方式排列

        ***...***OOO...OOO

            N个黑棋            N个白棋

 允许将相邻两个棋子互换位置,最后使队形成黑白交替排列,试编程实现该操作。



 15. 已知6个城市,用c[i,j]表示从i城市到城市j是否有单向的直达汽车

 (1=<i〈=6,1〈=j〈=6), c[i,j]=1 表示城市i到城市j有单向直达汽
 车; 否则 c[i,j]=0.  试编制程序,对于给出的城市代号i,打印出从该城市出
 发乘车(包括转车)可以到达的所有城市。

16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。
 真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的
 比较次数挑出伪造硬币,并鉴定它是重还是轻。



 17. 编写一个程序,当输入不超过60个字符组成的英文文字时,计算机将这个句子
 中的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长度
 相同。例如:

    输入:

    THE PRICE OFBREAD IS ¥1 25 PER POUND

    输出:

    ABC DDEEE EFHIINO OP ¥1 25 PPR RRSTU

 并且要求只对A到Z的字母重新排列,其它字符保持原来的状态。



 18. 在一线性七个格位置的图上有两种不同颜色的棋子A,B. 排列如下图所示,中间
 格的位置为空。

          ┎─┰─┰─┰─┰─┰─┰─┒
          ┃A┃A┃A┃  ┃B┃B┃B┃
          ┖─┸─┸─┸─┸─┸─┸─┚

 要求将A,B的现行位置交换,形成下图中的排列:

          ┎─┰─┰─┰─┰─┰─┰─┒
          ┃B┃B┃B┃  ┃A┃A┃A┃
          ┖─┸─┸─┸─┸─┸─┸─┚

 移动棋子的条件:

   (1) 每个格中只准放一个棋子。
   (2) 任意一个棋子均可移动一格放入空格内。
   (3) 一方的棋子均可跳过另一方的一个棋子进入空格。
   (4) 任何棋子不得跳跃两个或两个以上棋子(无论颜色同异)
   (5) 任何一个颜色棋子只能向前跳,不准向后跳。

 编程完成有关的移动,并且完成具有2N+1个格子的情形. 其中两种颜色各有
 N个棋子,且中间为空格.



 19. (背包问题) 有 N 件物品 d1,......dN,每件物品重量为 W1,..., WN
 (Wi > 0), 每件物品价值为 V1,......VN (Vi>0)。用这N件物品的某个子集
 填空背包,使得所取物品的总重量<=TOTAL,并设法使得背包中物品的价值尽可
 能高。



 20. (N皇后) 在国际象棋的棋盘上放置N个皇后,使其不能互相攻击,即任意
 两个皇后不能处在棋盘的同一行,同一列,同一斜线上,试问共有多少种摆法?

21. 请设计一个程序,由计算机把1.. ̄.8的八个自然数填入图中,使得横、
 竖、对角任何两个相邻的小方格中的两个数是不连续的。(下图右侧的 4 个图
 为禁止的情形).

            ┌─┐          ┌─┐               ┌─┐
            │  │          │4│               │8│
        ┌─┼─┼─┐      └─┼─┐       ┌─┼─┘
        │  │  │  │          │5│       │7│
        ├─┼─┼─┤          └─┘       └─┘
        │  │  │  │      ┌─┐
        └─┼─┼─┘      │6│           ┌─┬─┐
            │  │          ├─┤           │1│2│
            └─┘          │7│           └─┴─┘
                            └─┘



 22. 在一个4*4的小方格(如图所示)中放置8个*号,使得每行每列放且
 仅放两个*号。

          ┌─┬─┬─┬─┐
          │*│*│  │  │
          ├─┼─┼─┼─┤
          │*│  │*│  │
          ├─┼─┼─┼─┤
          │  │*│  │*│
          ├─┼─┼─┼─┤
          │  │  │*│*│
          └─┴─┴─┴─┘

 求出所有的基本解。



 23. (覆盖问题) 有边长为N(N为偶数)的正方形,请你用N^2/2个长为2,
 宽为1的长方形,将它全部覆盖。编程打印出所有覆盖方法。如:N=4

    ┌─┬──┬─┐            ┌──┬──┐
    │  │    │  │ 1224   │    │    │  1122
    │  ├──┤  │            ├──┼──┤
    │  │    │  │ 1334   │    │    │  3344
    ├─┼──┼─┤            ├──┼──┤
    │  │    │  │ 5668   │    │    │  5566
    │  ├──┤  │            ├──┼──┤
    │  │    │  │ 5778   │    │    │  7788
    └─┴──┴─┘            └──┴──┘



 24. 某地街道把城市分割成矩形方格,每一方格叫作块,某人从家中出发上班,
 向东要走M块,向北要走N块,(见图)。请设计一个程序,由计算机寻找并
 打印出所有的上班的路径。

                                               单位

           ┬   ┌─┬─┬─┬─┬─┬─┬─┐
           │   │  │  │  │  │  │  │  │
           │   ├─┼─┼─┼─┼─┼─┼─┤
           ↓   │  │  │  │  │  │  │  │
           N   ├─┼─┼─┼─┼─┼─┼─┤
           ↑   │  │  │  │  │  │  │  │
           │   ├─┼─┼─┼─┼─┼─┼─┤
           │   │  │  │  │  │  │  │  │
           ┴   └─┴─┴─┴─┴─┴─┴─┘
           家   ├─────→M←─────┤





 25. (量水) 用存水为M,N升的两个罐子,量出A升水。

26. (八数码问题) 8个编有数码1 ̄8的滑牌,能在3*3的井字格中滑动。
 井字格中有一格是空格,用0表示,因而空格周围的数码滑牌都可能滑到空格中去.

 下图是数码滑牌在井字格中的两种状态:

         ┎─┬─┬─┒                        ┏━┯━┯━┓
         ┃2 │8 │3 ┃                        ┃1 │2 │3 ┃
         ┠─┼─┼─┨                        ┠─┼─┼─┨
         ┃1 │6 │4 ┃     ---->         ┃8 │0 │4 ┃
         ┠─┼─┼─┨                        ┠─┼─┼─┨
         ┃7 │0 │5 ┃                        ┃7 │6 │5 ┃
         ┗━┷━┷━┛                        ┗━┷━┷━┛

            初始状态                              目标状态

 以左图为初始状态,右图为目标状态,请找出从初始状态到目标状态的滑牌移步
 序列,具体要求:

    (1)输入初始状态和目标状态的数据;
       a、分别用两行输入上述两项数据:
         例:Enter the initial state:2 8 3 1 6 4 7 0 5
             Enter the final state:1 2 3 8 0 4 7 6 5
       b、对输入数据应有查错和示错功能;
    (2)实现从初始状态到目标状态的转换(如不能实现,程序应输出不能实现
    的提示信息);
    (3)输出结果,每移动一步都必须在屏幕上显示:
       a、移动每一步时的序号,最后一步的序号即为移动总步数;
       b、每一步移动后以3*3表格形式显示状态。
    (4)要求能使移动步数尽可能少;


 27. 给出一个有8个格子的表格,除3个格子外,每个格子中可放入一个数字,这
 些数字取自自然数 1 到 5,放入格子中的数字不得相同,剩余的3个格子是空格
 (用O表示)。图1是一个放数字与空格的特例。现要求编程实现从初始表格状态
 变化到目标表格状态。初始状态和目标状态都是可变的(图1,图2所示的状态仅
 是一个特例),由键盘输入格子中的数字(0 ̄5)。

    移动规则:

   (1) 每一个数字只可以通过虚线移入相邻空格。如图1中,允许“2”左移入空
   格,而不能上移进入上面空格。
   (2) 只允许水平移动或垂直移动,不允许斜移。
   (3) 移动后,该数字原先所在的格子变成空格。

    实现目标:

   (1) 输入初始表格状态和目标表格状态的数据。
     ① 分别在一行内输入上述两项数据;
     ② 对输入的数据应有查错和报错功能;
   (2) 实现从初始状态到目标状态的转换(如不能实现也应给出必要的说明)。
   (3) 显示结果:每移动一步都应在屏幕上有如下信息:
     ① 显示每一步移动的序号。所以最后一步的序号就是移动的总步数。
     ② 显示每一步移动前后的表格状态。
   (4) 以最少的移动步数达到目标。

              ┎─┰─┰─┒                          ┎─┰─┰─┒
              ┃3┃4┃0┃                          ┃0┃0┃0┃
          ┎─╂─╂  ╂─╂─┒                  ┎─╂─╂  ╂─╂─┒
          ┃0  1  0  2  5┃                  ┃1  2  3  4  5┃
          ┖─┸─┸─┸─┸─┚                  ┖─┸─┸─┸─┸─┚

                图 10-1                             图 10-2

                初始状态A                              目标状态B



 28. n枚银币 C1,C2,...,Cn, 其中有一块不合格,不合格的银币比正常的要重。现用
 一天平找出不合格的一块,要求在最坏的情况下,用的天平次数最少。



 29. 把一段文章按要求排版。文章的输入方式为:由键盘输入一段以回车符结束的文章
 (最大长度 2000 个字符)。排版时以单词为基本单位。单词由不含空格的任意字符组
 成,是长度小于20个字符的串。空格符是分隔单词的唯一字符,在输入时连续的空格
 符在处理时应先化简为单个空格符。在排版前应先输入,排版后每行的字符数为N,排
 版后将整理好的文章按行输出。输出时不能将一个完整的单词截断,并要求输出的总行
 数最小。将每个不足N个字符的行用空格补足,填充空格符的方式有以下三种。

    1)将填充的空格符置于每行的末尾,并要求每行的起始为单词。
    2)将填充的空格符置于每行的开始,并要求每行的末尾为单词。
    3)将填充的空格符平均分配在每行中,并保证行的起始和末尾均为单词。



 30. 某机要部门安装了电子锁。M个工作人员每人发一张磁卡,卡上有开锁的密码特征。

 为了确保安全,规定至少要有N个人同时使用各自的磁卡才能将锁打开。问电子锁上至
 少要有多少种特征? 每个人的磁卡上至少要有多少特征? 如果特征的编号以小写英文字
 母表示,将每个人的磁卡的特征编号打印出来,要求输出的电子锁的总特征数最少。

    设 3<=M<=7, 1<=N<=4, M与N由键盘输入,工作人员编号用 1#,2#,...表示.

31. 甲乙两人从24枚棋子中轮流取子,甲先取,规定每次所取的枚数不能多于上
 一个人所取的枚数,也不可不取。

  (1)甲第一次取多少枚才能保证甲取得最后一枚,当然,他也不能第一次就把
 所有棋子都取走。
  (2)讨论棋子总数N(一定是偶数)从6到30的各种情况。讨论内容包括:

 对各个N,是否存在一个小于N的枚数M,甲第一次取M枚后就能保证甲如果策略
 正确,一定能取到最后一枚棋子。

32. ( 走棋 ) 一个4*4的方阵如图。有一个小卒从上往下走。走至格子1后就
 不能走动,走至0后,若下方为1,则向左或向右走,下方为0,则向下走。求所
 有走法。

              ┌─┬─┬─┬─┐
              │1 │0 │0 │0 │
              ├─┼─┼─┼─┤
              │0 │0 │1 │0 │
              ├─┼─┼─┼─┤
              │0 │1 │0 │0 │
              ├─┼─┼─┼─┤
              │1 │0 │0 │0 │
              └─┴─┴─┴─┘
 33. ( 野人与传教士 ) 设有三个传教士和三个野人来到河边,打算乘一只船从右
 岸渡到左岸去。该船最大负载能力为两人,在任何时候,如果野人人数超过传教士
 人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过
 河去呢?

 34. ( 取棋子 ) 设有N颗棋子,由人和计算机轮流从中取走若干颗。每方每次最
 多取K颗,最少取1颗 (K值不能超过总数的一半,也不能小于1)。试编写一程
 序使计算机有较多的获胜机会。

    屏幕输入提示:

    (1) 输入竞赛规则:A. 取最后一颗棋子的那一方为败.
                      B. 取最后一颗棋子的那一方为胜.
    (2) 总共有多少颗棋子?
    (3) 一次最多取几颗?
    (4) 谁先取?
    (5) 每个回合都应显示: A. 你取几颗?
                          B. 我取走......颗,还剩......颗.
    (6) 竞赛过程中发生违例时,打印出:  竞赛无法进行下去!
    (7) 竞赛结束后打印:
    I win!(我胜!)或  You win!(你胜!)。

 35. ( Grundy博弈 ) 在两位选手面前放着一堆铜币。第一位选手把原堆分成不相
 等的两堆。然后每个选手轮流地这样做,即当轮到某一方分时, 他把已被分开的任
 一堆再分成不相等的两堆。博弈这样一直进行下去,直到每一堆都只剩下一个或两
 个铜币为止,这时博弈结束。规定首先遇到这种情况的选手为输。

36. 猴子选大王:
   ① N 只猴子站成一行,每隔 M 只从头到尾报数,反复进行,报过数的退出,打
 印每次退出的猴子的编号,直到剩下一只为止。
   ② N 只猴子站成一行,每 M 只报数。先从头到尾,报到尾后,再返回从尾到头
 报数,打印每次方向及过程,直到剩下二只时,以排到后面的(指报数方向)为大王。
   ③ N 只猴子围成一圈,从第 P 个开始,每隔 M 只报数,打印每次过程,只剩下
 一个时为大王。

 37. 已知 N 个正整数满足 K1+K2+...+Kn=M。求一组最佳的分解,使得
 K1*K2*....*Kn 为最大。
   例如:N=2时,给定 K1+K2=6,当 K1=3,K2=3 时,K1*K2=9 为最大

 38. 有一集合中有 N 个元素,每个元素均为自然数。给定一个 total (假设每个
 元素值均小于total),求满足条件的所有子集,子集中各元素之和应等于total。

 39. 一个集合满足如下条件:
   (1)1是集合的元素;
   (2) 若 P 是集合的元素,则 2*P+1,4*P+5 也是集合的元素。
 求:此集合中最小的 K 个元素。
  ③ 对ABC作全排列而得的六个三位数之和为 2886。

 40. 一个整型变量只能用来存贮较小的 N!的值,当 N 较大时,可将阶乘值中的
 每一个数字放在一个一维数组的一个元素中。使用这方法,打印:
    ① N!的值;
    ② N!-M!(M>N);
    ③ N!+M!

41. (合并链表) 已知两个链表 AN={a1,a2,...an}, BN={b1,b2,...bm}, 将其合并
 为一个链表 CN={a1,b1,a2,b2,...}

 42. (算术表达式求值) 输入一个由数字、+,-,*,/ 及括号组成的算术表达式,
 求其值。

 43. 对于次数很高,但项目很少的多项式,可用链表来表示。
  例如:X^1000-76*X^76+3*X^3-7可表示为

  ┌─┬──┬─┐  ┌──┬─┬─┐   ┌─┬─┬─┐  ┌─┬─┬──┐
  │1 │1000│  ┼→│-76 │78│  ┼→ │3 │3 │  ┼→│-7│0 │ NIL│
  └─┴──┴─┘  └──┴─┴─┘   └─┴─┴─┘  └─┴─┴──┘

 在此方式下,编程完成两个多项式的加法与乘法。

 44. (一元多项式加法) 实现两个整系数一元多项式的加法。例如, 对于多项式
 5*X^6+4*X^3-7*X^4+1 与多项式 50*X^2+4*X, 运算结果为:
 5*X^6-7*X^4+4*X^3+50*X^2+4*X+1。

   程序要求:键盘输入多项式的各项系数及指数,每项系数及指数为一组数据(系
 数及指数之一可为零),以'0,0'结束一个多项式的输入,结果按降幂排列,同类
 项要合并(指数最大不超过30)。

   上例第一式的输入为:    5,6
                           4,3
                          -7,4
                           1,0
                           0,0
  输出结果应为:5*x^6-7*x^4+4*x^3+50*x^2+4*x+1.

 45. (数列的最小代价) 给定一个正整数序列,例如:4,1,2,3, 不改变数的位置把
 它们相加, 并且由括号来标记每一次加法所得到的和。例如:((4+1)+(2+3))=
 ((5)+(5))=10. 除去原数4、1、2、3之外,其余都为中间结果,如:5,5,10, 将中
 间结果相加,得到:5+5+10=20, 数 20 称为此数列的一个代价。对于另一种算法:
 (4+((1+2)+3))=(4+((3+3))=(4+(6))=10, 得到数列的另一个代价为:3+6+10=19.
 若给出 N 个数的数列,求出此数列的最小代价。

46. 设有一个字符串,长度小于 100,且全部以英文字母组成。对字串中的每个字
 母可用 0,1,2 三个数字进行编码,且数字可以重复使用。
 程序要求:(1) 输入字符串,并能判断输入是否有错;
           (2) 输出对应的编码表及码长,要求字串的编码总长度为最短;
           (3) 根据上述编码表,给出一些编码,然后求出其原字符串。
 例如:输入的字符为:ABCBAAADDEF
     其对应的编码表为:
         A:   2                B:  10
         C:  11                D:  12
         E:  00                F:  O1
 对应的编码为:210111022212120001       总码长为:18
 根据该编码,给出编码:010001121110222   则输出字串:FEFDCBAAAA.

 47. 某些密码由 N 个英文字母组成(N〈26), 每个字母的平均使用率为:W1,W2,...
 ,Wn, 要求编程完成下列任务:
    ① 键入英文字母及个数;
    ② 键入N个英文字母的使用频率;
    ③ 用二进制数对该N个英文字母进行编码(最短,无二义性);
    ④ 键入字母短文(单词用空格区分),输出相应编码;
    ⑤ 键入二进制编码短文,输出译文。

 48. 将4个红球,3个白球与3个黄球排成一排,共有多少种排法?

 49. 有面值为 M..N 的邮票各一枚,共能拼出多少不同的面额。

 50. 有一个四阶方阵,随机产生 1..16 这 16 个自然数(不重复),依次填入每
 个方格中。要求用最少的对调次数,使每一行、每一列以及对角线上的四个数之和
 均相等。打印每一次对调的过程。

 51. 微型蓝球赛. 甲,乙两队进行蓝球比赛,结果甲队以S:T 获胜.(T 由键盘输入). 比赛中, 甲队得分始终领先(严格大于乙队). 规定以任何方式进一
 球都只得一分. 编程序打印该比赛的每一种可能的不同的得分过程, 以及所有不同
 过程的总数.

52. 求两整型数组错位相加的最大面积.
    设整型数组 C 具有 N 个分量: C=(C1,C2,...,CN), 两相连分量(C[I],C[I+1])
 可计算一个面积: 若C[I],C[I+1]同号, 则面积 SI=abs(C[I]+C[I+1])/2, 否则,面
 积等于 (abs(a*C[I])+abs(b*C[I+1]))/2, 其中, a>0,b>0,a+b=1 (详见下图),数
 组 C 的面积 A=S[1]+S[2]+...+S[N-1].
     编程要求如下:
  从键盘输入 N, 再输入两个具有 N 个分量的数组: A1,A2:ARRAY [1..N] OF
 INTEGER; 将 A1,A2 错位相加(详见后面的例子)得数组A3, 求 A3 的面积.编程给
 出一个错位相加的方案, 使 A3 的面积最大.
    例: 设 N=3, A1=(3,7,2), A2=(-5,7,-4), 则应考虑 9 种情况:
                    (1)                         (2)
        A1  3  7  2                       3  7  2
        A2              -5  7  -4                  -5  7  -4
        A3  3  7  2  0  -5  7  -4         3  7  2  -5  7  -4
                    (3)                         (9)
        A1  3  7  2                                     3  7  2
        A2       -5  7 -4       ......     -5  7  -4
        A3  3  7 -3  7 -4                  -5  7  -4  0 3  7  2

 53. (工作安排问题) 现有 N (N≤8) 件工作, 分别由 N 个人完成, 每人都完成一
 件,且只完成一件, 每人完成不同工作的时间不同. 试设计一种分配工作方案, 使
 完成 N 件工作所需的总时间最少.
    原始数据由文本文件 EXAM1.TXT 给出, 其格式如下:
    第 1 行:        工作任务数(N)
    第 2 -- N+1 行: 第 i+1 行为第 i 个人完成各件工作所需的时间. 以上各数
 均为不超过 1000 的正整数.
    计算结果可直接在屏幕上输出: 第一行为工作分配方案, 共 N 组, 每组数据的
 形式为 a-b, 其中 a 为工作人员编号, b 为他应完成的工作序号.
    例: 设 EXAM1.TXT 的数据为:
         4
         2  15  13  4
         10  4  14  15
         9  14  16  13
         7  8  11  9
     对此, 一个正确的输出可以是
         1-4, 2-2, 3-1, 4-3
         TOTAL=28

 54. 求N个字符串的最长公共子串,N<=20,字符串长度不超过255。
    例如:N=3,由键盘依次输入三个字符串为
      What is local bus ?
      Name some local buses.
      local bus is a high speed I/O bus close to the processer.
 则最长公共子串为"local bus"。
 ( 参看程序 9 )

 55. (液晶显示) 下图是用液晶七笔阿拉数字表示的十个数字,我们把横和竖的一
 个短划都称为一笔,即7有3笔,8有7笔等。请把这十个数字重新排列,要做到
 两相邻数字都可以由另一个数字加上几笔或减去几笔组成,但不能又加又减。比如
 7→3是允许的,7→2不允许。编程打印出所有可能的排列。
    如:4107395682。

 56. (N阶梵塔) 有K根棒,第一根上放N片大小不等的圆盘,并保持上小下大的
 顺序。现将N片圆盘从第1根移至第K根,移动中均保持上小下大的顺序,问最少
 移几次方得结果,求出移动方案。
 ( 参看程序 3 )

57. 某一印刷厂有六项加工任务,对印刷车间和装订车间所需时间见下表(时间单       

 位:天)                                                                       

            任务  │J1  J2  J3  J4  J5  J6                                

        ─────┼───────────────                              

          印刷车间│ 3  12          11                               

          装订车间│ 8  10                                           

 如何安排加工顺序,使加工时间最少。                                             

                                                                                

 58. 将7万元投资到A,B,C三项目上,其利润见下表:                           

        投资额(万元)│ 1                                            

        ──────┼────────────────────                  

                │0.11  0.13  0.15  0.24  0.24  0.30  0.35                  

                  │0.12  0.16  0.21  0.25  0.25  0.29  0.34                  

                │0.08  0.12  0.20  0.26  0.26  0.30  0.35                  

  如何分配投资额,使获得的利润最大。                                            

                                                                                

 59. 无根树与通常所说的树(有根树)很相似,它包含有节点和枝,但不含有根。       

 无根树节点之间只有相邻关系。如图一所示,是一棵有七个节点的无根树,以图一       

 的A为根节点得到图二所示的有根树,以B为根节点得到图三所示的有根树,但从       

 无根树的角度看,图一、二、三是结构相同的无根树,同时无根树的结构与节点的       

 名称无关。                                                                     

    有根树可以用字符串的形式表示,其递归表示方法是:                            

        根节点(子树1    子树2    子树3...)                                 

 图一,图二的有根树可表示为 A(B(CF(EGD))) 和 B(ACF(EGD))。由于子树的表示        

 顺序可以不同,所以一棵有根树可以有多种表示方法,如图三又可表示成               

 B(F(EGD)CA) 或 B(ACF(DE(G)) 等。表示无根树时,可以以它任一节点为根节点,       

 将其看作有根树,从而可以利用有根树的字符串表示形式来表示无根树。               

    任务一:由键盘读入一个字符串表示的无根树,无根树的各节点的名称用互不        

 相同的大写英文字母表示。由用户输入一个节点的名称,程序应能够输出一种以该       

 节点为根节点的字符串形式。程序输出无根树的字符串形式时,各个节点的名称无       

 关紧要,所有节点都以P表示,以后的各种输出也采用这种形式。例如:输入无根       

 树的字符串形式:A(B(CD(EF))),指定根节点为D,程序应能输出          

 P(P(PP)PP),P(PP(PP)P),P(PPP(PP))中的任意       

 一种即可。                                                                     

    任务二:输入两个串表示的无根树,判断其结构是否一样。注意它与节点名称        

 无关,只考虑结构。                                                             

    任务三:输入无根树的总枝数N(1<=N<=11),输出所有枝数为N的互不相同        

 的无根树,并记录总数。以字符串形式输出,例如:N=5 时共有6种不同结构的无       

 根树。                                                                         

    注意:各种树结构的字符串表达形式不唯一。                                    

                                                                                 

 60. 用N*N(1<=N<=8)的格点阵代表海,其中*号代表岛。给你一组编       

 码信息,让你重构一张地图。这组信息是按垂直方向,水平方向岛的情况摘取的。       

 下例中,每行右边的数字按顺序表示该行中“岛组”的大小,如第一行数字为           

 “12”,表示该行第一“岛组”由一个岛组成,第二“岛组”由两个岛组成,而       

 第四列下面的“23”则表示本列由两个“岛组”组成,第一个“岛组”由两个岛       

 组成,第二个“岛组”由三个岛组成。                                             

    任务:编程执行以下步骤,直到给定的输入 (ASCII) 文件中的信息组全部读完       

 为止,步骤如下:                                                               

   (1)从输入文件 (ASCII 文件)中读入下一个信息块,并将它显示在屏幕上。       

 每个信息块组成为:                                                             

    格点阵大小 (N),以后是行的约束条件(N行的),列的约束条件(N列的),       

 每行(或每列)的约束条件是                                                     

    一行数字,数字间有空格,最后用0结束。上面的例子如图所示。                   

   (2)重构这张地图(若有多个解,要逐个构成地图),并显示。                   

   (3)将重构的地图以ASCII文件形式输出。每岛以*后加一个空格表示;       

 空白处用连续的两个空格表示。若同一已知条件可画出多张地图,相互间用空行隔       

 开;若一组已知条件画不出地图,用“NO  MAP(占一行)表示。由不同的信       

 息组求得的解用“NEXT  PROBLEM”(占一行表示)1<=N<=8.        

                                                                                

 61. 一个餐厅在相继的N天里,第 i 天需要 Ri 块餐巾(i=1,2,...,N)。餐厅        

 可以从三种途径得到餐巾:                                                        

   (1) 购买新的餐巾,每块需P分;                                                

   (2) 把用过的餐巾送到快洗部,洗一块需M天,费用需F分(F<P);               

   (3) 把餐巾送到慢洗部,洗一块需N天(N>M),费用需S分(S<F)。             

 在每天结束时,餐厅必须决定将多少块用过的餐巾送到快洗部,多少块送慢洗部,       

 多少块保存起来延期送洗。在每天开始时,餐厅必须决定是否购买新餐巾及购买多       

 少,使洗好的和新购的餐巾之和满足当天的需求量Ri,并使N天总的费用最小。请       

 编程输入总天数,每天所需的餐巾块数以及每块餐巾的新购费用P,快,慢洗费用       

 F,S,和所需天数M,N,输出每天开始时需购新餐巾数,结束时送快,慢洗部       

 和延期送洗的餐巾数。                                                           

                                                                                 

 62. ( 旅行商 ) 一个推销员计划做一次旅行,他必须访问如图所示每个城市。每        

 两个城市的路径旁标有路径。要求从城市A出发,访问每个城市一次,且只访问一       

 次,最后返回城市A,求一条距离最短的路线。                                     

                                                                                

 63. (tic__tac__toe 游戏) tic__tac__toe 游戏的规则是:从一个空的 (N*N) 的       

 棋盘(例如N=3)开始,甲乙二人轮流将棋子放置在棋盘上未被占据的方格中,       

 例如甲第一个放,他把棋子放在中央的方格里, 然后轮到乙放,他把棋子放在第       

 一行中间的方格里。于是又轮到甲放,......如此进行下去。判定胜负的方法是:       

 若某一游戏者有N枚棋子占据了一横行,或一竖列,或一对角线,则此人获胜;若       

 直至整个棋盘被占满还没有一方获胜,则为平局。                                   

     ┏━┯━┯━┓         ┏━┯━┯━┓         ┏━┯━┯━┓               

                                     │O│                 

     ┠─┼─┼─┨         ┠─┼─┼─┨         ┠─┼─┼─┨               

                      │X│             │X│                 

     ┠─┼─┼─┨         ┠─┼─┼─┨         ┠─┼─┼─┨               

                                                        

     ┗━┷━┷━┛         ┗━┷━┷━┛         ┗━┷━┷━┛               

                                                                                 

 64.  以字符串形式由键盘输入两个高精度的8进制正整数,串长小于255,以        

 第一个数为被除数,第二个数为除数,进行高精度除法运算,并显示按 8 进制表        

 示的商和余数。                                                                 

 ( 参看程序 8 )                                                                                

 

 65. ( NOI'94.1_1 ) 键盘输入一个仅由小写字母组成的字符串,输出以该串中任        

 取M个字母的所有排列及排列总数。                                               

                                                                                 

 66. ( NOI'94.1_2 ) 编程实现两个高精度实数减法,两数分别由键盘输入,均不        

  超过240位。                                                                 

 ( 参看程序 5 )                                                                               

 

 67. ( NOI'94.1_3 ) 一个实数数列共有N项,已知a(i)=(a(i-1)-a(i+1))/2+d,        

(1〈i〈N)(N<60) , 键盘输入N,d,a(1),a(n),m,输出 a(m)。                 

                                                                                

 68. ( NOI'94.1_4 ) 键盘输入一个高精度的正整数N,去掉其中任意S个数字后         

 剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种       

 方案使得剩下的数字组成的新数最小。输出应包括所去掉的数字的位置和组成的新       

 的正整数。(N不超过240位)                                                 

 

 69. 在两个文本文件中各存有一个以西文制表符制成的未填入任何表项的表结构,       

 分别称之为表1和表2,要求编程将表1和表2下述规则合并成表3:                  

     规则:表1在表2之上,表1和表2的左边框对齐,将表1的最低行与表2的       

 最顶行合并。例:在你的C盘根目录下有两个文件 t0.1 和 t0.2,分别存放上述        

 的表1和表2,经上述规则合并后得到表3,放在文件中。三张表见下图:             

  ┎─┰─┰─┰─┒                                ┎─┰─┰─┰─┒          

                  ┎┰─┰─┒                              

  ┠─╂─╂─╂─┨        ┃┃                ┠─╂─╂─╂─┨          

                  ┖┸─┸─┚                              

  ┖─┸─┸─┸─┚                                ┠┰┸┰┸┰┸─┚          

                                                    ┃┃                    

                                                    ┖┸─┸─┚                

        表1                    表2                     表3                   

    编程要求:                                                                   

   (1) 程序应能自给定的文件中读入两个源表并显示。                               

   (2) 若源表有错,应能指出其错。                                               

   (3) 将表1和表2规则合并成表3,并显示之。                                   

   (4) 所有制表符的ASCII码应由选手自己从给出的示例文件中截取。              

 

 70. (圆盘问题) 从左向右依次安放 4 根细柱 A,B,C,D. 在 A 上套有 N (N≤20)       

 个直径相同的圆盘, 从下到上依次用连续的小写字母 a,b,c,...编号, 将这些圆盘       

 经过 B, C 单向地移入 D (即不允许从右向左移动). 圆盘可在 B,C 中暂存. 从键       

 盘输入 N, 及前 N 个小写字母的一个排列, 它表示最后在 D 盘上形成的一个从下       

 到上的圆盘序列. 请用文本文件 ANS2.TXT 输出形成这一排列的操作过程.              

   该文件的每一行为一个形如 "k M L" 的字母序列, 其中 k 为圆盘编号, M 为 k       

 盘原先的柱号, L 为新柱号. 或者直接在屏幕上输出"No",表示不能生成这种排列.       

     例:                                                                

     键盘输入:                                                          

         3                        d   ━╋━                              

         acb                      c   ━╋━                              

     则一个正确的输出文件         b   ━╋━                              

  可以是:                         a   ━╋━                              

      c  A  B                       ━━┻━━━┻━━━┻━━━┻━       

      b  A  C                           A       B       C       D               

      a  A  D                                                                    

      b  C  D                                                                   

      c  B  D                                                                   

                                                                                 

 71. (最长连线) 设有一个 N×N 的方格图形,且 N 为 3 的倍数。要求在图形中        

 存放 0 或 1,相邻的 1 可以连成一条连线,连接的方法可以是行,也可以是列;       

 同时约定一条连线只能有一个起点和一个终点,图形上的点最多只能访问一次。         

 编程求最长连线. 例如 N=6 时,有下图:                                                         

                                                                   

               ┌─┬─┬─┬─┬─┬─┐                                       

             │1│1│1│0│0│1│                                       

               ├─┼─┼─┼─┼─┼─┤                                       

             │1│1│0│1│1│1│                                       

               ├─┼─┼─┼─┼─┼─┤                                       

             │0│0│0│1│0│1│                                       

               ├─┼─┼─┼─┼─┼─┤                                        

             │1│1│0│1│1│1│                                       

               ├─┼─┼─┼─┼─┼─┤                                       

             │0│1│0│0│0│0│                                       

               ├─┼─┼─┼─┼─┼─┤                                        

             │1│1│1│1│0│0│                                       

               └─┴─┴─┴─┴─┴─┘                                       

   在该图中,包含有如下的一些连线:                                             

     1←1←1        1←1                                                 

                                                                          

     1→1                             1→1                              

                                                                          

                       1→1→1                                           

                                                                            

                                          1←1←1                             

    在以上的连线中,最长的连线为:    表示方法:                                

                                    最长连线长度:LMAX=9                      

                                    连线:(1,6)→(2,6)→                      

     1→1                               (3,6)→(4,6)→                      

                                        (4,5)→(4,4)→                      

                                        (3,4)→(2,4)→                      

                                        (2,5)                                

     1←1←1                  连线的表示不是唯一的,仅给出一种即可。         

                                                                                

                                                                                

 72. (NOI'95.1_2) 在一个园形操场的四周摆放 N 堆石子(N≤100), 现要将石子       

 有次序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆       

 的石子数,记为该次合并的得分。                                                 

  编一程序,由文件读入堆数 N 及每堆的石子数(≤20),                           

  ① 选择一种合并石子的方案, 使得做N-1次合并, 得分的总和最小;                  

    ② 选择一种合并石子的方案, 使得做N-1次合并, 得分的总和最大.                 

    例如, 图 2-1 所示的4堆石子,每堆的石子数(从最上面的一堆数起, 顺时针数)       

依次为4  5  9  4. 则 3 次合并得分总和最小的方案为图2-2,得分总和最大的方案       

为图 2-3.                                                                        

    (加图)                                                                      

  输入数据:                                                                   

    文件名由键盘输入,该文件内容为;                                             

    第一行为石子堆数 N;                                                          

    第二行为每堆的石子数, 每两个数之间用一个空格符分隔                          

    输出数据:                                                                   

    输出文件名为 OUTPUT.TXT                                                     

  第 1 至 N-1 行为得分最小的合并过程. 每行包含两个数, 表示应该合并的两        

 堆石子的数目, 小数在前, 大数在后, 第 N 行为合并成一堆后的最小得分总和;         

 第 N+1 行为空行, 第 N+2 至 2N+1 行为得分最大合并过程(格式同前). 第 2N+2        

 行为最大得分总和.                                                              

                                                                                 

 73. (NOI'95.1_4) N 位由 0 和 1 组成的字符串 A、B 可分别表示为                  

  A=aNaN-1…ai…a2a1                                                    

  B=bNbN-1…bi…b2b1                                                     

 其中, ai=0或1, bi=0或1,   1≤i≤N, N≤15.                                  

    如果存在某一位j(j∈1…N), 在该位上两串不同, 即aj≠bj, 而其余N-1位         

 上的两串相同, 即ai=bi(i∈1…N,i≠j), 则称 A、B 两串“互邻”。              

  比如,在N=4时, A=1100, B=1000, A、B 两串“互邻”, 而 C=1100, D=        

 1010, C、D 两串不“互邻”。                                                    

 编程要求:                                                                     

    寻找一个含有 2N 个上述01串的序列, 该序列满足以下要求:                       

    ① 组成该序列的每一个01串都与其它串不同;                                     

    ② 第k个串与第k-1个串有“互邻”关系,2≤k≤2N;                              

    ③ 该序列首项由输入指定.                                                    

    例如 N=2, 指定首项为01, 则一个满足上述要求的序列为                          

    01  11  10  00                                                               

  输入数据                         ┏━━━━━━┓  ┏━━━━━┓           

    文件名由键盘输入                 ┃EXAMPLE4.TXT┃  ┃MODEL4.TXT┃           

    该文件共有两行                   ┠──────┨  ┠─────┨           

    第一行为  N                      ┃2             ┃2                    

    第二行为指定的序列首项           ┃01            ┃01                   

                                                   ┃11                   

  输出数据                         ┗━━━━━━┛  ┃10                   

    输出文件为 OUTPUT.TXT                              ┃00                   

    第一行为  N                                                             

    第二行至第2N+1行依次输出序列的每一个串.            ┗━━━━━┛           

  输入输出举例                                                                 

    参考输入文件: EXAMPLE4.TXT                                                  

    参考输出文件: MODEL4.TXT                                                    

                                                                                 

 74. (NOI'95.1_5) m、n为整数,且满足下列两个条件:                              

  ① m、n∈{1, 2, …, k}, (1≤k≤109)                                       

    ② (n^2-m*n-m^2)^2=1                                                     

    编一程序, 由键盘输入k, 求一组满足上述两个条件的 m、n, 并且使m^2+n^2        

 的值最大.                                                                      

    例如, 若 k=1995, 则 m=987, n=1597 时, 则 m、n 满足条件, 且可使           

 m^2+n^2的值最大.                                                               

                                                                                

 75. (钱币系统问题) 某钱币系统由 k (k≤20) 种硬币组成, 币值依次为 a[1],         

 a[2],...,a[k], 其中 a[i] (i=1,2,...,k) 为互不相同的正整数, 且依降序排列,       

 a[1]≤200. 给定某整数币值 n(n≤3000), 要求用最少枚数的硬币表示这个币值.         

    输入: 用文件输入已知数据, 格式为:                                           

      第 1 行: k (硬币种数)                                                     

      第 2 行: a[1] a[2] ... a[k] (各币值用空格隔开,已按降序排列好)             

      第 3 行: n (给定的币值)                                                    

    输出: 直接在屏幕上输出结果. 如果该钱币系统无法表示币值 n,应输出'No',        

 否则按以下格式输出:                                                            

      第 1 行: 最少钱币枚数 r.                                                  

      第 2 行: 输出若干形如 m*n 的表达式, m 为币值, n为使用该币值的枚数.        

 各式第 2 个因子之和应等于 r, 各式乘积之和应等于 n.                             

    例: 设 (a[1],a[2],a[3])=(5,2,1),  n=12,  则应输出                           

       3                                                                         

       5*2  2*1.                                                                

                                                                                

 76. (省刻度尺问题)给定长度为 L 的直尺, L 为整数, 且L≤40. 为了能一次直接       

 量出  1,2,...,L 的各种长度, 该尺内部至少要有多少条刻度 ?  请输出最少刻度       

 数( 不含两端点)及每个刻度的位置. 测量长度时可利用两端点, 其位置分别为 0,       

 L.                                                                             

    输入: 由键盘输入 L.                                                         

    输出: 用文本文件按以下格式输出结果(文件名: ANS2.TXT):                       

      第 1 行: S ( 最少刻度数 )                                                 

      第 2 行: 尺内 S 个刻度的位置                                              

      第 3 行至第 L+2 行: 每行输出 3 个用空格隔开的整数 t m n, 其中             

 1≤t≤L 为要测量的各长度, m,n 依次为该长度的起止刻度 (m                    

    例: 如果 L=6, 则一个正确的输出是:                                           

       2                                                                        

       1 4                    提示:  (1) 最少刻度数 S 应满足:                    

       1 0 1                     C[S+2,2]=(S+2)*(S+1)/2≥L.                     

       2 4 6                         (2) 除两端点外, 第一个刻度可取为           

       3 1 4                     A[1]=1, 第二个刻度可在 1, L-2, L-1 这          

       4 0 4                     三个数中选取.                                  

       5 1 6                                                                    

       6 0 6                                                                    

                                                                                 

 

你可能感兴趣的:(C++题解)