回 帖 发 新 帖 刷新版面

主题:求前几年的noip试卷和答案

请大家帮帮忙

如是.doc或.pdf发到gmie@qq.com

回复列表 (共15个回复)

11 楼

    i, number, ndata, sum: integer;
    data: array[1..100] of integer;
procedure solve(s, sign, n: integer);
var i: integer;
begin
    for i := s to ndata do begin
        inc(sum, sign * (number div (n * data[i])));
        solve(i + 1, -sign, n * data[i]);
    end;
end;
begin
    read(number ,ndata);
    sum := 0;
    for i := 1 to ndata do read(data[i]);
    solve(1, 1, 1);
    writeln(sum);
end.
输入:1000 3 5 13 11
输出:             。

12 楼

3.program program3;
var c: array[1..3] of string[200];
    s: array[1..10] of integer;
    m, n, i: integer;
procedure numara;
var cod: boolean;
     i, j, nr: integer;
begin
    for j := 1 to n do begin
        nr := 0; cod := true;
        for i := 1 to m do
            if c[i, j] = '1' then begin
                if not cod then begin
                    cod := true; inc(s[nr]); nr := 0;
                end
            end
            else begin
                if cod then begin
                    nr := 1; cod := false;
                end
                else inc(nr);
            end;
        if not cod then inc(s[nr]);
    end;
end;
begin
    readln(m, n);
    for i := 1 to m do readln(c[i]);
    numara;
    for i := 1 to m do
        if s[i] <> 0 then write(i, ' ', s[i], ' ');
end.
输入:
3 10
1110000111
1100001111
1000000011
输出:             。

4.program program4;
const
    u: array[0..2] of integer = (1, -3, 2);
    v: array[0..1] of integer = (-2, 3);
var
    i, n, sum: integer;
function g(n: integer): integer;
var i, sum: integer;
begin
    sum := 0;
    for i := 1 to n do inc(sum, u[i mod 3] * i);
    g := sum;
end;
begin
    sum := 0;
    read(n);
    for i := 1 to n do inc(sum, v[i mod 2] * g(i));
    writeln(sum);
end.
输入:103
输出:             。

五.完善程序 (前5空,每空2分,后6空,每空3分,共28分)

1.Joseph
题目描述:
原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,…,n。从编号是1的人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,…,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号的1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:
仅有的一个数字是k(0 < k <14)。
输出:
    使得最先出列的k个人都是坏人的m的最小值。
输入样例:
4
输出样例:
30
程序:
program program1;
var
    i, k, m, start: longint;
    find: boolean;
function check(remain: integer): boolean;
var result: integer;
begin
    result:=(  ①  ) mod remain;
    if(  ②  )then begin
        start := result; check := true;
    end
    else check := false;
end;
begin
    find := false;
    read(k);
    m := k;
    while (  ③  ) do begin
        find := true; start := 0;
        for i := 0 to k-1 do
            if( not check(  ④  )) then begin
                find := false; break;
            end;
        inc(m);
    end;
    writeln(  ⑤  );
end.

2.逻辑游戏
题目描述:
一个同学给了我一个逻辑游戏。他给了我图1,在这个图上,每一段边界都已经进行了编号。我的任务是在图中画一条连续的曲线,使得这条曲线穿过每一个边界一次且仅穿过一次,而且曲线的起点和终点都在这整个区域的外面。这条曲线是容许自交的。
对于图1,我的同学告诉我画出这样的一条曲线(图2)是不可能的,但是对于有的图形(比如图3),画出这样一条曲线是可行的。对于给定的一个图,我想知道是否可以画出满足要求的曲线。
      
图1    图2
      
图3    图4
输入:
输入的图形用一个n×n的矩阵表示的。矩阵的每一个单元里有一个0到255之间(包括0和255)的整数。处于同一个区域的单元里的数相同,相邻区域的数不同(但是不相邻的区域里的数可能相同)。
输入的第一行是n(0<n<100)。以下的n行每行包括n个整数,分别给出对应的单元里的整数(这n个整数之间用空格分开)。图4给出了输入样例对应的图形。
输出:
    当可以画出满足题意的曲线的时候,输出“YES”;否则,输出“NO”。
输入样例:
3
1 1 2
1 2 2
1 1 2
输出样例:
    YES
程序:
program program2;
const
    d: array[0..7] of integer = (1, 0, -1, 0, 0, 1,   ①  );
var
    orig, n, i, j, ns: integer;
    a: array[0..101, 0..101] of integer;
    bun: boolean;
procedure plimba(x, y: integer);
var i, x1, y1: integer;
begin
    a[x, y] := -a[x, y];
    if (abs(a[x - 1, y]) <> orig) and ((  ②   <> a[x - 1, y])
or (abs(a[x, y - 1]) <> orig)) then inc(ns);
    if (abs(a[x + 1, y]) <> orig) and ((a[x + 1, y - 1] <> a[x + 1,y])
or (abs(a[x, y - 1]) <> orig)) then inc(ns);
    if (abs(a[x, y - 1]) <> orig) and ((  ③   <> a[x, y - 1])
or (abs(a[x - 1, y]) <> orig)) then inc(ns);
    if (abs(a[x, y + 1]) <> orig) and ((a[x - 1, y + 1] <> a[x,y + 1])
or (abs(a[x - 1, y]) <> orig)) then inc(ns);
    for i := 0 to 3 do begin
        x1 := x + d[2 * i];y1:=y+  ④  ;
        if (x1 >= 1) and (x1 <= n) and (y1 >= 1) and (y1 <= n) and
(  ⑤  ) then plimba(x1, y1);
    end;
end;
begin
    bun := true;
    read(n);
    for i := 0 to n+1 do
for j := 0 to n+1 do a[i, j] := 0;
    a[0, 0] := -1; a[n + 1, 0] := -1;
    a[0, n + 1] := -1; a[n + 1, n + 1] := -1;
    for i := 1 to n do
for j := 1 to n do read(a[i, j]);
    for i := 1 to n do
for j := 1 to n do
if a[i, j] > -1 then begin
                ns := 0;   ⑥  ;
                plimba(i, j);
                if ns mod 2 = 1 then bun := false;
            end;
    if bun then writeln('YES');
    if not bun then writeln('NO');
end.



               赛区              市                   学校   姓名                


13 楼

==========================  密    封    线  =======================

  第十届全国青少年信息学奥林匹克联赛初赛试题

                                   提高组答卷纸
           阅                卷                记                    录  
总阅卷人                                                     总 得 分
      第    一    大      题    得   分        第三大题得分    
题号     1     2     3    4    5    6    7    8    9    10    第四大题得分
得分                                            1)    2)    3)    4)
      第    二    大      题    得   分        第五大题得分
题号    11    12    13    14    15    16    17    18    19    20    (1)        (2)    
得分                                                        

============================  以下由考生填写 ============================
                                     
                                    答卷部分
一.    单项选择题 (共10题,每题1.5分,共计15分。每题有且仅有一个正确答案.)。

题号      1      2      3      4      5      6      7      8      9     10
选择                                         

14 楼

二.不定项选择题 (共10题,每题1.5分,共计15分。多选或少选均不得分)。

题号     11      12      13      14      15      16      17      18      19     20
选择                                        

三.问题求解(共2题,每题5分,共计10分)

  1. 答:         
  
  2. 答:             

四. 阅读程序(共4题,每题8分,共计32分)
  
(1)    程序的运行结果是:  

(2)     程序的运行结果是:



               赛区              市                   学校   姓名                


==========================  密    封    线  =======================

四. 阅读程序(共4题,每题8分,共计32分)
  
(3)    程序的运行结果是:  



  (4)程序的运行结果是:



五. 完善程序 (前5空,每空2分,后6空,每空3分,共28分)

     Pascal 语言                                 
=================           
1.
(1) ________________________________
(2) ________________________________
(3) ________________________________
(4) ________________________________
(5) ________________________________
2.
(1) ________________________________
(2) ________________________________
(3) ________________________________
(4)________________________________
(5)________________________________
(6) ________________________________


第十届全国青少年信息学奥林匹克联赛初赛试题
提高组参考答案
一.    单项选择题 (共10题,每题1.5分,共计15分。每题有且仅有一个正确答案.)。
题号      1      2      3      4      5      6      7      8      9     10
选择      A      D      E      C      B      B      C      D      C     A
二.不定项选择题 (共10题,每题1.5分,共计15分。多选或少选均不得分)。
题号     11      12      13      14      15      16      17      18      19     20
选择      BC     ACDE      BCD      D      AC      BE      ADE     ACD     ABDE     BCE
三.问题求解(共2题,每题5分,共计10分)
1.    答:  10  
2.    答:  a b d f g e c   
四. 阅读程序(共4题,每题8分,共计32分)
(1)程序的运行结果是:  263
(2) 程序的运行结果是:  328
  (3)程序的运行结果是:  1 4 2 1 3 3
(4)程序的运行结果是:  -400
五. 完善程序 (前5空,每空2分,后6空,每空3分,共28分)

    Pascal语言                                     
=================            
1.
(1)      start+m-1                                    
(2)      result>=k  (或者k<=result)                               
(3)     not find (或者 find=false)                              
(4)      2*k-i                             
(5)      m-1                                                    
2.
(1)     0,-1
(2)    a[x-1,y-1]
(3)    a[x-1,y-1]
(4)    d[2*i+1]
(5)    a[x1,y1]=orig (或者orig=a[x1,y1])
(6)    orig:=a[i,j]

15 楼

帮忙给个答案


谁拿了最多奖学金
(scholar.pas/c/cpp)



【问题描述】



某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:



1)      院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;

2)      五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

3)      成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

4)      西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

5)      班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;



只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。



现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。



【输入文件】



输入文件scholar.in的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。



【输出文件】



输出文件scholar.out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。



【样例输入】



4

YaoLin 87 82 Y N 0

ChenRuiyi 88 78 N Y 1

LiXin 92 88 N N 0

ZhangQin 83 87 Y N 1



【样例输出】



ChenRuiyi

9000

28700





过河
(river.pas/c/cpp)



【问题描述】



在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。

题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。



【输入文件】



输入文件river.in的第一行有一个正整数L(1 <= L <= 109),表示独木桥的长度。第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100。第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。



【输出文件】



输出文件river.out只包括一个整数,表示青蛙过河最少需要踩到的石子数。



【样例输入】



10
2 3 5
2 3 5 6 7



【样例输出】



2



【数据规模】



对于30%的数据,L <= 10000;

对于全部的数据,L <= 109。



篝火晚会
(fire.pas/c/cpp)



【问题描述】



佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有n个同学,编号从1到n。一开始,同学们按照1,2,……,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。

佳佳可向同学们下达命令,每一个命令的形式如下:

(b1, b2,... bm -1, bm)

这里m的值是由佳佳决定的,每次命令m的值都可以不同。这个命令的作用是移动编号是b1,b2,…… bm –1,bm的这m个同学的位置。要求b1换到b2的位置上,b2换到b3的位置上,……,要求bm换到b1的位置上。

执行每个命令都需要一些代价。我们假定如果一个命令要移动m个人的位置,那么这个命令的代价就是m。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?



【输入文件】



输入文件fire.in的第一行是一个整数n(3 <= n <= 50000),表示一共有n个同学。其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。



【输出文件】



输出文件fire.out包括一行,这一行只包含一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出-1。



【样例输入】



4

3 4

4 3

1 2

1 2



【样例输出】



2



【数据规模】



对于30%的数据,n <= 1000;

对于全部的数据,n <= 50000。





等价表达式
(equal.pas/c/cpp)



【问题描述】



明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。

这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?



这个选择题中的每个表达式都满足下面的性质:

1.  表达式只可能包含一个变量‘a’。

2.  表达式中出现的数都是正整数,而且都小于10000。

3.  表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)

4.  幂指数只可能是1到10之间的正整数(包括1和10)。

5.  表达式内部,头部或者尾部都可能有一些多余的空格。

下面是一些合理的表达式的例子:

((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……



【输入文件】



输入文件equal.in的第一行给出的是题干中的表达式。第二行是一个整数n(2 <= n <= 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……

输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。



【输出文件】



输出文件equal.out包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。



【样例输入】



( a + 1) ^2

3

(a-1)^2+4*a

a  + 1+ a

a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a



【样例输出】



AC



【数据规模】



对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;

对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。



对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。

我来回复

您尚未登录,请登录后再回复。点此登录或注册