切换到宽版
  • 17034阅读
  • 22回复

[转]入门必做的题 [复制链接]

上一主题 下一主题
离线cefly
只看该作者 10 发表于: 2006-08-29
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 )
离线cefly
只看该作者 11 发表于: 2006-08-29
57. 某一印刷厂有六项加工任务,对印刷车间和装订车间所需时间见下表(时间单
位:天)
        任务 │J1 J2 J3 J4 J5 J6
    ─────┼───────────────
      印刷车间│ 3 12 5   2   9 11
      装订车间│ 8 10 9   6   3 1
如何安排加工顺序,使加工时间最少。

58. 将7万元投资到A,B,C三项目上,其利润见下表:
    投资额(万元)│ 1   2   3   4   5   6   7
    ──────┼────────────────────
        项 A │0.11 0.13 0.15 0.24 0.24 0.30 0.35
          B │0.12 0.16 0.21 0.25 0.25 0.29 0.34
        目 C │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│ ┃
  ┠─┼─┼─┨       ┠─┼─┼─┨       ┠─┼─┼─┨
  ┃ │ │ ┃       ┃ │ │ ┃       ┃ │ │ ┃
  ┗━┷━┷━┛       ┗━┷━┷━┛       ┗━┷━┷━┛
离线cefly
只看该作者 12 发表于: 2006-08-29
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
离线cefly
只看该作者 13 发表于: 2006-08-29
71. (最长连线) 设有一个 N×N 的方格图形,且 N 为 3 的倍数。要求在图形中
存放 0 或 1,相邻的 1 可以连成一条连线,连接的方法可以是行,也可以是列;
同时约定一条连线只能有一个起点和一个终点,图形上的点最多只能访问一次。
编程求最长连线. 例如 N=6 时,有下图:
          1 2 3 4 5 6
          ┌─┬─┬─┬─┬─┬─┐
      1 │1│1│1│0│0│1│
          ├─┼─┼─┼─┼─┼─┤
      2 │1│1│0│1│1│1│
          ├─┼─┼─┼─┼─┼─┤
      3 │0│0│0│1│0│1│
          ├─┼─┼─┼─┼─┼─┤
      4 │1│1│0│1│1│1│
          ├─┼─┼─┼─┼─┼─┤
      5 │0│1│0│0│0│0│
          ├─┼─┼─┼─┼─┼─┤
      6 │1│1│1│1│0│0│
          └─┴─┴─┴─┴─┴─┘
  在该图中,包含有如下的一些连线:
  1←1←1     1←1               1
  ↓           ↓                 ↓
  1→1         1           1→1 1
              ↓           ↑     ↓
              1→1→1       1     1
                            ↑     ↓
                            1←1←1
  在以上的连线中,最长的连线为:   表示方法:
        1               最长连线长度:LMAX=9
        ↓               连线:(1,6)→(2,6)→
  1→1 1                   (3,6)→(4,6)→
  ↑     ↓                   (4,5)→(4,4)→
  1     1                   (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
行为最大得分总和.
离线cefly
只看该作者 14 发表于: 2006-08-29
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=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.
离线cefly
只看该作者 15 发表于: 2006-08-29
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<n).
  例: 如果 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
离线cefly
只看该作者 16 发表于: 2006-08-29
有些图乱了,,可以跳过吧。。。虽然说是“入门必做的题”,但做完的话,对付NOI是没有问题了吧。。
离线archimedes

只看该作者 17 发表于: 2006-08-29
引用第16楼cefly2006-08-29 19:37发表的“”:
有些图乱了,,可以跳过吧。。。虽然说是“入门必做的题”,但做完的话,对付NOI是没有问题了吧。。

是NOIP还是NOI?
离线cefly
只看该作者 18 发表于: 2006-08-29
对付NOI和NOIP都可以。。。。这些都是经典题。。。
离线郁闷的猪
只看该作者 19 发表于: 2006-09-04
....好长,看了头昏,缩点好吗?说精要的好吗?
快速回复
限100 字节
 
上一个 下一个