小学生信息学奥赛决赛题2008年决赛答案

阅读: 评论:0

2008年长沙市小学生计算机奥林匹克竞赛决赛试题
(时间:150分钟)
一、整数处理100北京社会函授大学分)(存盘程序名:T1
电脑老师让小慧编程做一道题:输入一个正整数A(A≤全国土壤污染状况调查公报100000000),如果A的个位数字是5,则统计A能被5整除多少次?否则,统计A当中含有多少个“0”?你能做吗?
例如:输入:125           输入:305160
   输出:3                        输出:2
程序:
program cs200801;
var
  a:longint;{根据A的取值范围,采用长整型}
  n:integer;
begin
  readln(a);
  n:=0;
  if a mod 10=5 then
  repeat
    a:=a div 5;
    n:=n+1;
  until a mod 5<>0{统计A能被5带除多少次}
  else begin
  repeat
    if a mod 10=0 then n:=n+1;
    a:=a div 10;
  until a<10;{统计A当中含有多少个0}
  end;{采用if……then……else……结构,以符合题目的逻辑关系}
  writeln(n);
  readln
end.

二、新年同庆(100分)(存盘程序名:T2
过年了,小慧与邻居邻居的小伙伴共n人相约一起放花炮:他们同时放响了第一个,随后n个人分别以a1a2a3、……、an秒的间隔继续放花炮,每人都放了b个。问:总共可听到多少声花炮响?
输入:nn10
      a1  a2  ……  an(每个数≤100,以空格相隔)
      bb100
输出:一个整数(听到的花炮响声数)
例如:输入:3                        输出:7
      1  2  3
      4
解题思路:
  用数组的下标表示时间,元素的值不为0表示听到花炮响。用同一个数组来标示所有人放花炮的过程,同时响的花炮在数组中会被记录在同一元素中。最后统计数组中有数据的元素个数,就能得出共听到了多少声花炮响。这一方法还可以求出在某一时刻,同时有多少个花炮一起响。
程序:
program CS200802;
var
  n,b,i,j,k,s:integer;
  a:array[1..100] of integer;
  c:array[1..10000] of integer;{用于记录花炮响。最多100个,间隔最大100,下标范围到10000可满足条件}
begin
  readln(n);
  for i:=1 to n do read(a[i]);{为保证输入格式,此处用read(),不用readln()}
  readln(b);
  c[1]:=n;{第一个花炮同时放响}
  for i:=1 to n do begin{1n代表放花炮的每个人}
    k:=1;{第一个花炮响的时间}
    for j:=2 to b do begin{2至b代表从第2个到第b个花炮}
      k:=k+a[i];{依次得到花炮响的时间}
      c[k]:=c[k]+1;{将花炮响时间记录到数组c}
    end;
  end;
  s:=0;
  for i:=1 to 10000 do if c[i]<>0 then s:=s+1;{求一共听到多少次花炮响}
  writeln(s);
  {for i:=1 to 10000 do if c[i]<>0 then write(i:3);
  writeln;
  for i:=1 to 10000 do if c[i]<>0 then write(c[i]:3);}{输出所有花炮响的时刻及有多少花炮同时响}
  readln
end.
三、文档编辑(100分)(存盘程序名:T3
暑假当中,妈妈让小慧帮忙修改英文资料,英文中还有一些统计数据(统计数据都是正整数,而且其前、后都有空格)。妈妈说:如果文档结尾处有“end”,则应当删除,文中所有的统计数据都要加上一个正整数m。你能编程序完成小慧的任务吗?
输入:m
   待修改的文档(字符串)
输出:修改后的文档(字符串)
例如:输入:13
      There are 45 students d
   输出:There are 58 students in 32class.
解题思路:
这个题目由两个问题构成,一个是处理文档结尾处的“end”。一个是处理统计数据。
处理文档结尾处的“end”,需要判断出文档最后三个字母是不是“end”。先用length函数求出文档的长度,再copy函数截取文档最后三个字母和“end”进行比较。
处理统计数据关键在于获取空格的位置。利用pos函数可以取得空格的位置。
在处理整个文档时,先处理文档结尾处的“end”,然后一个一个单词进行处理。处理完一个单词就输出一个单词并从字符串中删除此单词及其后的空格。遇到统计数据则按题目要求处理。
需要注意的是,依题意,文档开头和结尾的数据不作统计数据处理。
程序:
program CS200803;
var
  m,n:longint;
  l,i,c,k:integer;
  s,s1:string;
begin
  readln(m);
  readln(s);
  l:=length(s);
永远的超哥>多聚赖氨酸  if copy(s,l-2,3)='end' then delete(s,l-2,3);{删除文档结尾的'end'
  k:=pos(' ',s);{查第一个空格的位置}
  for i:=1 to k do write(s[i]);
  delete(s,1,k);{输出并删除文档第一个单词。这一步主要是为了解决第一个单词是数据的情况,依题意,因前面没有空格,不做统计数据处理}
  repeat
    if (char(s[1])>=char('0')) and (char(s[1])<=char('9')) then{单词第一个字母是数字,则可能是统计数据}
    begin
钛合金丝      k:=pos(' ',s);
      s1:=copy(s,1,k-1);
      val(s1,n,c);{将此单词转换为数值}
      if c=0 then{c=0则意味着转换过程中没有出错,单词完全由数字组成}
      begin
        write(n+m,' ');
        delete(s,1,k);
      end else begin
        for i:=1 to k do write(s[i]);
        delete(s,1,k);
      end;
    end else begin;{c<>0,意味着转换过程出错,单词不是统计数据}
      k:=pos(' ',s);
      for i:=1 to k do write(s[i]);
      delete(s,1,k);
    end;
  until pos(' ',s)=0;{处理到最后一个空格为此,后面的不可能再为统计数据,因后面没有空格了}
  write(s);{输出文档的剩余部分}
  readln
end.

四、智力冲浪(100分)(存盘程序名:T4
小慧准备参加湖南电视台举办的智力冲浪节目。规则如下:
冲浪者首先拥有m个快乐金球。冲浪当中设有n个游戏项目,每个游戏项目都必须在整分钟时开始,限时1分钟,而且都规定了最后完成期限(即:冲浪开始t分钟内必须完成)。如果一个游戏项目没按规定完成,则从冲浪者的快乐金球中扣掉一部分,不同游戏项目扣掉的金球数也不同。游戏项目的顺序自己安排。最终,赢得快乐金球数最多的选手胜出。
小慧非常想夺得冠军,请你计算出小慧最多能赢得多少个快乐金球?
输入:nm10000n50
   n个整数(以空格相隔),分别表示每个游戏项目规定的完成期限(≤n
   n个整数(以空格相隔),分别表示每个游戏项目未完成时扣掉的金球数
输出:一个整数(最多能赢得快乐金球的个数)
例如:输入:10000 7
            4  2  4  3  1  4  6
      20  60  70  40  30  50  10
输出:9950
哈特曼
程序:
program CS200804;
var
  m,n,i,j,t,time,s:integer;
  a,b,c:array[1..50] of integer;
  flag:boolean;
begin
  readln(m,n);
  for i:=1 to n do read(a[i]);
  for i:=1 to n do read(b[i]);
  for i:=1 to n do m:=m-b[i];
  for i:=1 to n do
    for j:=i+1 to n do begin
      if a[i]>a[j] then begin
      t:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t;
    end;end;{按照完成期限由短至长排序}
  for i:=1 to n do
    for j:=i+1 to n do begin
      if (a[i]=a[j]) and (b[i]<b[j]) then begin
      t:=a[i];a[i]:=a[j];a[j]:=t;t:=b[i];b[i]:=b[j];b[j]:=t;
    end;end;{相同完成期限的按从大到小排序}
  {for i:=1 to n do write(a[i]:3);writeln;
  for i:=1 to n do write(b[i]:3);writeln;}{测试用,查看排序结果}
  for i:=1 to n do
      for j:=i to n do if (a[j]=i) and (b[j]>c[i]) then begin

本文发布于:2023-06-27 23:50:50,感谢您对本站的认可!

本文链接:https://patent.en369.cn/xueshu/139034.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:文档   单词   处理   空格   炮响   统计数据   项目   花炮
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图