急求:信息学竞赛(普及组)的试卷(pascal)??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急求:信息学竞赛(普及组)的试卷(pascal)??相关的知识,希望对你有一定的参考价值。

2006noip普及组复赛试题、测试数据及参考程序1.明明的随机数

(random.pas/c/cpp)

【问题描述】

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

【输入文件】

输入文件random.in 有2行,第1行为1个正整数,表示所生成的随机数的个数:

N

第2行有N个用空格隔开的正整数,为所产生的随机数。

【输出文件】

输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

【输入样例】

10

20 40 32 67 40 20 89 300 400 15

【输出样例】

8

15 20 32 40 67 89 300 400

2.开心的金明

(happy.pas/c/cpp)

【问题描述】

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:

v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*为乘号)

请你帮助金明设计一个满足要求的购物单。

【输入文件】

输入文件happy.in 的第1行,为两个正整数,用一个空格隔开:

N m

(其中N(<30000)表示总钱数,m(<25)为希望购买物品的个数。)

从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有2个非负整数

v p

(其中v表示该物品的价格(v<=10000),p表示该物品的重要度(1~5))

【输出文件】

输出文件happy.out只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<100000000)。

【输入样例】

1000 5

800 2

400 5

300 5

400 3

200 2

【输出样例】

3900

3.Jam的计数法
(count.pas/c/cpp)

【问题描述】

Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为Jam数字。在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用b,c,d,e,f,g,h,i,j这些字母。如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。(如果我们用U、V依次表示Jam数字“bdfij”与“bdghi”,则U< v,且不存在Jam数字P,使U< p<v )。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。

【输入文件】

输入文件count.in 有2行,第1行为3个正整数,用一个空格隔开:

s t w

(其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s< span>≤26, 2≤w≤t-s )

第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。

所给的数据都是正确的,不必验证。

【输出文件】

输出文件counting.out 最多为5行,为紧接在输入的Jam数字后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。每行只输出一个Jam数字,是由w个小写字母组成的字符串,不要有多余的空格。

【输入样例】

2 10 5

bdfij

【输出样例】

bdghi

bdghj

bdgij

bdhij

befgh

4.数列

(sequence.pas/c/cpp)

【问题描述】

给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:

1,3,4,9,10,12,13,…

(该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)

请你求出这个序列的第N项的值(用10进制数表示)。

例如,对于k=3,N=100,正确答案应该是981。

【输入文件】

输入文件sequence.in 只有1行,为2个正整数,用一个空格隔开:

k N

(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。

【输出文件】

输出文件sequence.out 为计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。

【输入样例】

3 100

【输出样例】

981

20006noip普及组测试数据点击浏览该文件

参考程序:
1、
program random;
var a:array[1..100]of integer;
i,j,n,t,s:integer;
begin
assign(input,'random.in');
assign(output,'random.out');
reset(input);
rewrite(output);
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then begin t:=a[i];a[i]:=a[j];a[j]:=t;end;
for i:=1 to n-1 do
if a[i]=a[i+1] then begin a[i]:=0;s:=s+1;end;
writeln(n-s);
for i:=1 to n do
if a[i]<>0 then write(a[i],' ');
close(input);
close(output);
end.

2、
program happy;
var s,n,i,j:integer;a,b:array[0..25]of integer;
f:array[0..25,0..30000]of longint;
begin
assign(input,'happy.in');
assign(output,'happy.out');
reset(input);
rewrite(output);
readln(s,n);
for i:=1 to n do
readln(a[i],b[i]);
for i:=1 to n do
for j:=1 to s do
if j>=a[i] then if f[i-1,j-a[i]]+a[i]*b[i]>f[i-1,j]
then f[i,j]:=f[i-1,j-a[i]]+a[i]*b[i] else f[i,j]:=f[i-1,j];
writeln(f[n,s]);
close(input);
close(output);
end.

3、
program count;
type arr=array[1..26]of boolean;
var a:arr;s1:string;x,y,n,m,i:integer;s:array[1..26]of char;
procedure pro(var a:arr);
var i,j,t:integer;
begin
for i:=y downto x do
begin
t:=0;
if a[i] then
if (not a[i+1]) and (i+1<=y) then
begin
for j:=i to y do
a[j]:=false;
for j:=x to i-1 do
if a[j] then begin write(s[j]);t:=t+1;end;
for j:=i+1 to (i+n-t) do begin write(s[j]);a[j]:=true;end;
writeln;
m:=m+1;if m=5 then begin close(input);close(output);halt end else pro(a);
end;
end;
end;
begin
assign(input,'count.in');
assign(output,'count.out');
reset(input);
rewrite(output);
readln(x,y,n);
readln(s1);m:=0;s:='';
for i:=x to y do a[i]:=false;
for i:=1 to n do
a[ord(s1[i])-ord('a')+1]:=true;
for i:=1 to 26 do s[i]:=' ';
for i:=x to y do
s[i]:=chr(ord('a')+i-1);
pro(a);
close(input);
close(output);
end.

4、
program sequence;
var k,n,i,j:integer;sum:longint;
a:array[1..50]of integer;
function mi(k,n:integer):longint;
var i:integer;s:longint;
begin
s:=k;
for i:=2 to n do
s:=s*k;
mi:=s;
end;
begin
assign(input,'sequence.in');
assign(output,'sequence.out');
reset(input);
rewrite(output);
readln(k,n);
i:=0;
repeat
i:=i+1;
a[i]:=n mod 2;
n:=n div 2;
until n=0;
for j:=i downto 1 do
if a[j]=1 then sum:=sum+mi(k,j-1);
writeln(sum);
close(input);
close(output);
end.

参考资料:http://www.eduqy.com.cn/noi/dispbbs.asp?boardid=7&ID=674

参考技术A http://www.vijos.cn/Problem_Real.asp本回答被提问者采纳

noip2006普及组pascal试题解答

普及组(Pascal 语言)参考答案与评分标准

一、单项选择题:(每题 1.5 分)由OIFans.cn收集
1. D 2. B 3. B 4. C 5. B 6.B 7. C 8. A 9. D 10. D

11. C 12. D 13. C 14. B 15. C 16. B 17. B 18. A 19. C 20. B

二、问题求解:(每题 5 分)

1. 4 次 (1 分),
第一步:分成 3 组:27,27,26,将前 2 组放到天平上(4 分)。

2.有获胜策略(1 分),第 1 次在第 5 堆中取 32 颗石子(4 分),。

三、阅读程序写结果

1. 10,10 (对 1 个数给 4 分,无逗号扣 1 分)

2. 6 28 496 8128 33550336

(前 2 个对 1 个数给 1 分,后 3 个对 1 个数给 2 分)

3. 5

4. 6 2 5 4 3 7 9 9 7 3 4 5 2 6(数字之间无空格扣 2 分)

四、完善程序(前 4 空(①--④),每空 2.5 分,后 6 空(⑤--⑩),每空 3 分)

1.① k=n (或 n=k)

② count mod 5=0

③ perm(k+1)由OIFans.cn收集

④ a[k]:=a[j];a[j]:=t

⑤ perm(1)

2.⑥ break

⑦ t mod 50=0

⑧ a-p*b(或 a-b*p)

⑨ c*10+1 (或 10*c+1)

⑩ n

参考资料:http://www.oifans.cn/docs/noip2006/06ppans/noip2006.htm

参考技术A #include <fstream>
#include <string.h>
using namespace std;
ifstream fin("machine.in");
ofstream fout("machine.out");
const int maxn = 100+5;
int n, m, g[maxn][maxn];
int link[maxn], used[maxn];

int path(int i)

if (used[i]) return 0;
used[i] = 1;
int j;
for (j = 1; j <= m; j++) if (g[i][j])
if (!link[j] || path(link[j]))

link[j] = i;
return 1;

return 0;


main()

int i, j, k;
fin >> n >> m >> k;
memset(g, 0, sizeof(g));
for (i = 0; i < k; i++)

int temp, x, y;
fin >> temp >> x >> y;
if (x && y) g[x][y] = 1;


memset(link, 0, sizeof(link));
memset(used, 0, sizeof(used));

for (i = 1; i <= n; i++) if (path(i)) memset(used, 0, sizeof(used));
int tot = 0;
for (i = 1; i <= m; i++) if (link[i]) tot++;
fout << tot << endl;
return 0;

以上是关于急求:信息学竞赛(普及组)的试卷(pascal)??的主要内容,如果未能解决你的问题,请参考以下文章

noip2009初赛答案

悬赏!急!pascal竞赛普及组模拟试题

求一份noip普及组pascal语言的模拟试题(笔试)

noip普及组2010模拟试题(pascal)

求第十二届全国青少年奥林匹克信息学联赛(普及组PASCAL语言)复赛试题

noip2010普及组初赛