noip普及组复赛模拟试题26(答案)

更新时间:2024-07-11 08:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1.数字反转(reverse.cpp/c/pas)【问题描述】给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。【输入】输入文件名为 reverse.in。 输入共 1 行,一个整数N。

【输出】输出文件名为 reverse.out。

输出共 1 行,一个整数,表示反转后的新数。 【输入输出样例 1】reverse.in reverse.out 123 321

【输入输出样例 2】Reverse.in reverse.out -380 -83

【数据范围】-1,000,000,000 ≤ N≤ 1,000,000,000。

var

s3,s1,s2:string; n,i:integer; begin

assign(input,'reverse.in');reset(input);

assign(output,'reverse.out');rewrite(output); read(s1);

n:=length(s1); if s1[1]='-' then begin s2:='-';

for i:=1 to n-1 do s1[i]:=s1[i+1]; delete(s1,n,1); end;

n:=length(s1); for i:=1 to n do s3:=s3+s1[n-i+1]; i:=1;

while(s3[i]='0')and(length(s3)>1) do delete(s3,1,1); write(s2+s3);

close(input);close(output); end.

2.统计单词数(stat.cpp/c/pas)【问题描述】一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章 中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配, 即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1), 如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。 【输入】输入文件名为 stat.in,2 行。

第 1 行为一个字符串,其中只含字母,表示给定单词;

第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

【输出】输出文件名为 stat.out。

只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开, 分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字 母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。 【输入输出样例 1】stat.in stat.out To

to be or not to be is a question 2 0

【输入输出样例 1 说明】输出结果表示给定的单词 To 在文章中出现两次,第一次出现的位置为0。 【输入输出样例 2】stat.in stat.out to

Did the Ottoman Empire lose its power at that time -1

【输入输出样例 2 说明】表示给定的单词 to 在文章中没有出现,输出整数-1。

【数据范围】1 ≤ 单词长度≤ 10。1 ≤ 文章长度≤ 1,000,000

第二题有个陷阱,如果纯粹用字符串的7个操作命令,由于字串很长,后面几个点肯定超时。第二行的长串可以用字符一个个读。遇到空格跟上一行的串进行比较。这样能保证在规定时间内不超时。 var s1,s2:string; ch:char; s,first,n,i,ans:longint;

begin assign(input,'stat.in');reset(input); assign(output,'stat.out');rewrite(output); readln(s1); s1:=upcase(s1); first:=-1; n:=length(s1); while not eoln do begin

s2:=''; repeat

inc(s); read(ch); ch:=upcase(ch); if ch<>' 'then s2:=s2+ch; until (ch=' ')or eoln; if s2=s1 then if first=-1 then begin

first:=s-n-1; inc(ans); end else inc(ans); end;

if first=-1 then write(-1) else write(ans,' ',first); close(input);close(output); end.

3.数字统计 (two.pas/c/cpp) 【问题描述】 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数。 比如给定范围[2, 22],数字 2 在数2中出现了 1次,在数 12中出现 1 次,在数 20 中出现 1 次,在数

21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6次。

【输入】 输入文件名为 two.in。 输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。 【输出】 输出文件名为 two.out。输出共 1 行,表示数字 2 出现的次数。 【输入输出样例1】 Two.out two.in 2 22 6

【输入输出样例2】 two.out two.in 2 100 20

【数据范围】 1 ≤ L ≤R≤ 10000。

var a,b,c,d,e,f:integer; begin

assign(input,'two.in');reset(input);

assign(output,'two.out');rewrite(output); readln(a,b); f:=0;d:=0;

for c:=a to b do begin e:=c; repeat

d:=e mod 10; e:=e div 10;

if d=2 then inc(f); until e=0; end;

writeln(f);

close(input);close(output); end.

输入2 100 输出 20 输入 1 1000 输出 300

输入 2222 2223 输出 7 输入 9993 10000 输出 0

4. 接水问题 (water.pas/c/cpp)【问题描述】 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。

现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到 n 编号,i号同学的接水量为 wi。接水开始时,1 到 m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 wj 后,下一名排队等候接水的同学 k马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第x 秒结束时完成接水, 则 k 同学第 x+1 秒立刻开始接水。 若当前接水人数 n’不足 m,则只有 n’个龙头供水,其它 m?n’个龙头关闭。

现在给出 n名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

【输入】输入文件名为 water.in。

第 1 行2 个整数 n 和 m,用一个空格隔开,分别表示接水人数和龙头个数。 第 2 行 n 个整数 w1、w2、??、wn,每两个整数之间用一个空格隔开,wi表示 i 号同学的接水量。

【输出】输出文件名为 water.out。

输出只有一行,1 个整数,表示接水所需的总时间。 【输入输出样例1】 water.out water.in

5 3 4 4 4 1 2 1

【输入输出样例1解释】

第 1 秒,3 人接水。第 1秒结束时,1、2、3 号同学每人的已接水量为 1,3 号同学接完水,4 号同学接替 3 号同学开始接水。

第 2 秒,3 人接水。第 2 秒结束时,1、2 号同学每人的已接水量为 2,4 号同学的已接水量为 1。

第 3 秒,3 人接水。第 3 秒结束时,1、2 号同学每人的已接水量为 3,4 号同学的已接水量为 2。4号同学接完水,5 号同学接替 4 号同学开始接水。 第 4 秒,3 人接水。第 4 秒结束时,1、2 号同学每人的已接水量为 4,5 号同学的已接水量为 1。1、2、5 号同学接完水,即所有人完成接水。 总接水时间为 4 秒。 【输入输出样例2】

water.in water.out 8 4 163 23 71 87 32 70 93 80 76

【数据范围】

1 ≤ n ≤ 10000,1 ≤m≤ 100 且 m≤ n; 1 ≤wi ≤ 100。

var a:array[1..101]of integer; b:array[1..10001]of integer; c,d,e,f,g:integer; h:longint; tf:boolean; begin

assign(input,'water.in');reset(input);

assign(output,'water.out');rewrite(output); fillchar(b,sizeof(b),0); fillchar(a,sizeof(a),0); readln(c,d); for e:=1 to c do read(b[e]);

for e:=1 to d do a[e]:=b[e]; f:=d; h:=0; repeat

tf:=true; inc(h);

for g:=1 to d do begin

if a[g]>0 then dec(a[g]);

while (a[g]=0)and(f0 then tf:=false;

end;

until tf=true; writeln(h);

close(input);close(output); end. 或const

inf='water.in'; ouf='water.out'; var

n,m,i,j,k,tot,min,max:longint; a:array[1..10000] of longint; b:array[1..100] of longint; begin

assign(input,inf);reset(input); assign(output,ouf);rewrite(output); readln(n,m);

for i:=1 to n do a[i]:=0; for i:=1 to n do read(a[i]); for i:=1 to m do b[i]:=a[i];

min:=maxlongint; max:=-maxlongint;

if n=m then//如果水管数和人数相等,那么直接输出节水量的最大值就行了 begin

for i:=1 to m do

if b[i]>max then max:=b[i]; writeln(max);

close(input);close(output); halt; end;

for i:=m+1 to n do begin

min:=maxlongint; for j:=1 to m do if b[j]

min:=b[j];

k:=j;//找接水量最小的水管,并记录该水管的位置 end;

b[k]:=b[k]+a[i];//该水管的接水量+下一个人的接水量 end;

max:=-maxlongint; for i:=1 to m do

if b[i]>max then max:=b[i];//搜一遍,找接水量的最大值 writeln(max);

close(input);close(output);

end. 输入10 4

4 37 71 16 28 34 28 87 39 43 输出 124 输入100 20

76 26 67 21 73 19 66 23 46 57 63 8 58 65 94 65 96 1 98 52 92 36 28 7 67 94 92 76 85 38 54 88 28 33 33 55 4 94 66 28 69 86 67 98 36 14 94 27 41 59 79 96 96 29 100 52 11 27 60 87 56 54 66 38 52 87 100 82 46 70 52 34 52 65 78 74 35 94 29 84 77 40 86 19 24 79 42 6 32 53 44 85 61 31 99 64 74 61 81 81 输出 331

模拟法

Var a:array[1..10000] of integer; N,mI,j,k:longint; Begin

Assign(input,’water.in’);reset(input); Assign(output,’water.out’);rewrite(output); Readln(n,m); For i:=1 to n do Read(a[i]); For i:=m+1 to n do Begin K:=1;

For j:=1 to m do If a[j]

For i:=1 to m do

If a[i]>a[k] then k:=I; Writeln(a[k]); Close(input); Close(output); End.

本文来源:https://www.bwwdw.com/article/u4x.html

Top