NOIP2016提高组Pascal试题

NOIP2016提高组Pascal试题
NOIP2016提高组Pascal试题

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

提高组 Pascal 语言试题

竞赛时间:2016 年 10 月 22 日 14:30~16:30

选手注意:

●试题纸共有12 页,答题纸共有2 页,满分100 分。请在答题纸上作答,写在试题纸上

的一律无效。

●不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。

一、单项选择题(共15 题,每题1.5 分,共计22.5 分;每题有且仅有一个正确选项)

1.以下哪一种编程语言是最早的面向对象程序设计语言()。

A. Java

B. Smalltalk

C. Visual Basic

D. Fortran

2.人工智能之父图灵在二战中所研发的计算机()成功破译了德军的密码。

A.Enigma

B.巨人计算机

C.ENIAC

D.ABC计算机

3.128KB的存储器用十六进制表示,它的最大的地址码是( )

A. 10000

B. EFFF

C. 1FFFF

D. FFFFF

4.下列说法不正确的是()。

A.在逻辑电路中,与门可以用或门和非门的组合来代替

B.在逻辑电路中,或门可以用与门和非门的组合来代替

C.在逻辑电路中,亦或门可以用与门和非门的组合来代替

D.以上选项有一个是错的

5.以下十进制小数的二进制表述不是无限循环小数的是()。

A. 0.123

B. 0.124

C. 0.125

D. 0.126

6.在半导体中经常会使用单向导电的PN结,其中P型半导体的载流子为()。

A. 电子

B. 正电子

C. 负离子

D. 空穴

7.计算机病毒传染的必要条件是( ) 。

A. 与万维网联通

B. 删除文件

C. 对磁盘进行读写操作

D. 复制文件

8.计算机网络可分为三类,它们是( )。

A. Internet、Intranet、Extranet

B.广播式网络、移动网络、点-点式网络

C. X.25、MAN、WAN

D. LAN、MAN、WAN

9.近期一款新游戏“精灵宝可梦”让玩家可以实现在生活中捕捉精灵,其实现主要运用了()技术。

A.虚拟现实

B.增强现实

C.混合现实

D.影像现实

10.2016年7月25日,美国电信巨头Verizon(威瑞森)以48亿美元收购( )的核心资产。

A.Google

B.yahoo!

C.facebook

D.IBM

11.在保证树的节点数足够大且数据互不相同的条件下,若这棵树满足( )的定义,就不可能符合堆的定义。

A. 完全二叉树

B. 满二叉树

C.二叉排序树

D.红黑树

12.在存在负权边的情况下,以下( )最短路算法仍然能够正常执行?

A. Dijkstra

B. Floyd

C. Bellman-Ford

D.以上三个都不能

13.设某算法的计算时间表示为递推关系式T(n) = T(n/2) + n(n 为正整数)及T(0) = 1,则

该算法的时间复杂度为()。

A.O(log n)

B. O(n log n)

C. O(n)

D. O(n2)

14.在图论的诸多算法中,Dijkstra算法是一种采用了()思想的算法。

A.贪心

B. 分治

C. 动态规划

D. 回溯

15.在NOI 系列赛事中参赛选手必须使用由承办单位统一提供的设备。下列物品中允许选手自带的是()。

A. 草稿纸

B. 笔

C. 计算机

D.键盘

二、不定项选择题(共5 题,每题1.5 分,共计7.5 分;每题有一个或多个正确选项,多选或少选均不得分)

1.以下不属于多用户操作系统的有()。

D. Mac OS

A. Windows XP

B. DOS

C. Linux

2.下列属于图片文件格式的有()。

D. JPEG

A. GIF

B. PSD

C. TIFF

3. 关于windows系统中的窗口和对话框的说法正确的是( ).

A. 对话框能移动和改变大小

B. 窗口能移动和改变大小

C. 对话框只能移动和但不能改变大小

D. 对话框不能移动但能改变大小

4.下列关于十进制数100的正确说法是( ).

A.反码为64H

B.反码为9BH

C.补码为64H

D.补码为9BH

5.下面关于算法的正确的说法是( )

A. 算法必须有输出

B. 算法必须在计算机上用某种语言实现

C. 算法不一定有输入

D. 算法必须在有限步执行后能结束

三、问题求解(共2 题,每题5 分,共计10 分;每题全部答对得5 分,没有部分分)

1.盛况空前的足球赛即将举行。球赛门票售票处排起了球迷购票长龙。按售票处的规定,

每位购票者限购一张门票,每张票售价50元。在排成长龙的球迷中有5个人手持面额50元的钱币,另有5个人手持100元面额的钱币。现在售票处初始状态下没有零钱,那么,这10个人一共有___________种排队方式,可使得售票处不出现找不出钱的尴尬局面。

2.对于一个n阶完全图,对每一条边染上红色或蓝色两种颜色之一。若对于任意一种染

色方法,都在这个双染色的n阶完全图中,存在一个子图,使得该子图为四阶完全图,且满足其6条边颜色均一样,则最小的n为___________。

四、阅读程序写结果(共4 题,每题8 分,共计32 分)

1.var a,b:longint;

begin

readln(a,b);

writeln(a mod b);

end.

输入:-62 -4

输出:_________

2.function gcd(a,b:longint; var x,y:longint):longint;

var t:longint;

begin

if b=0 then

begin

x:=1; y:=0;

exit(a);

end;

gcd:=gcd(b,a mod b,y,x);

y:=y-(a div b)*x;

end;

var a,b,x,y:longint;

begin

readln(a,b);

gcd(a,b,x,y);

writeln(a*x+y*b);

end.

输入:198 156

输出:_________

3.var n,i,x,sum:longint;

begin

readln(n);sum:=0;

for i:=1 to n do

begin

x:=i;

while x mod 2=0 do

begin

x:=x >> 1;

inc(sum);

end;

end;

writeln(sum);

end.

输入:2147483647

输出:___________

4.const maxn=20;

type

nettype=record

c,f:integer;

end;

nodetype=record

l,p:integer;

end;

var

lt:array[0..maxn] of nodetype;

g:array[0..maxn,0..maxn] of nettype;

n,s,t:integer;

procedure init;

var i,j:integer;

begin

readln(n);

fillchar(g,sizeof(g),0);

fillchar(lt,sizeof(lt),0);

for i:=1 to n do

for j:=1 to n do

read(g[i,j].c);

end;

function find:integer;

var i:integer;

begin

i:=1;

while (i<=n) and not((lt[i].l<>0)and(lt[i].p=0)) do

inc(i);

if i>n then find:=0

else find:=i;

end;

function ford(var a:integer):boolean;

var

i,j,m,x:integer;

begin

ford:=true;

fillchar(lt,sizeof(lt),0);

lt[s].l:=s;

i:=find;

if i=0 then exit;

for j:=1 to n do

if (lt[j].l= 0)and((g[i,j].c<>0)or(g[j,i].c<>0)) then begin

if (g[i,j].f

if (g[j,i].f>0) then lt[j].l:=-i;

end;

lt[i].p:=1;

until (lt[t].l<>0);

m:=t;

a:=maxint;

repeat

j:=m;

m:=abs(lt[j].l);

if lt[j].l<0 then x:=g[j,m].f;

if lt[j].l>0 then x:=g[m,j].c-g[m,j].f;

if x

until m=s;

ford:=false;

end;

procedure change(a:integer);

var m,j:integer;

begin

m:=t;

repeat

j:=m;

m:=abs(lt[j].l);

if lt[j].l<0 then g[j,m].f:=g[j,m].f-a;

if lt[j].l>0 then g[m,j].f:=g[m,j].f+a;

until m=s;

end;

procedure print;

var

i:integer;

max:integer;

begin

for i:=1 to n do

if g[i,t].f<>0 then

max:=max+g[i,t].f;

writeln(max);

end;

procedure process;

var del:integer;

success:boolean;

begin

s:=1;

t:=n;

repeat

success:=ford(del);

if success then print()

else change(del); until success;

end;

begin

init();

process();

end.

输入:

5

0 5 0 7 0

0 0 1 0 0

0 0 0 0 4

0 0 2 0 0

0 0 0 0 0

输出:_________

五、完善程序(共2 题,每题14 分,共计28 分)

1.高精度算法(第1空4分,第2、3空每空2分,第3、4空每空3分)

在本题中,a,b,c三个数组分别代表两个操作数和结果,其下标为0的记录均表示该数的十进制长度。

下面是常量定义与类型定义:

const

maxn=100; wei=10;

type

arr=array[0..maxn]of longint;

下面是高精度加法:

procedure jia(a,b:arr; var c:arr);

var

i,p:longint;

begin

if a[0]

begin

c:=a;

a:=b;

b:=c;

end;

fillchar(c,sizeof(c),0);

for p:=1 to a[0] do

begin

i:=p;

c[i]:=c[i]+a[p]+b[q];

c[i+1]:=c[i+1]+c[i] div wei;

c[i]:=c[i] mod wei;

end;

if c[i+1]>0 do

inc(i);

c[0]:=i;

end;

下面是高精度乘法:

procedure cheng(a,b:arr; var c:arr);

var

i,p,q:longint;

begin

fillchar(c,sizeof(c),0);

for p:=1 to a[0] do

for q:=1 to b[0] do

begin

i:= (1) ;

c[i]:= (2) ;

c[i+1]:=c[i+1]+c[i] div wei;

c[i]:=c[i] mod wei;

end;

while (3) do

begin

inc(i);

c[i+1]:= (4) ;

c[i]:= (5) ;

end;

c[0]:=i;

end;

2.(放棋子问题)有一个n行m列的棋盘,棋盘的每一个格子都有黑白两种颜色中的一种,

黑色(用1表示)代表可以放棋子,白色(用0表示)则不可以放棋子,并且有边相邻的两个格子不能同时都放上棋子,试编程求一共能有几种放棋子的方法。输出方法数对100000000取模的结果。(第1、2、3、4空每空3分,第5空2分)

样例输入:

2 3

1 1 1

0 1 0

样例输出:

9

const model=100000000;

var n,m,x,i,j,p,k,ans:longint;

var st,map:array [0..10000] of longint;

//分别存每一行的状态和格子的颜色

f:array [0..13,0..100000] of longint; //表示在第i行状态为j时候可以放棋子的种数function judge1(x:longint):boolean;

begin

exit((x and (x<<1))>0);

end;

//判断二进制有没有相邻的1

function judge2(i,x:longint):boolean;

begin

exit((map[i] and st[x])>0);

end;

begin

fillchar(st,sizeof(st),0);

fillchar(map,sizeof(map),0);

fillchar(f,sizeof(f),0);

readln(n,m);

for i:=1 to n do

begin

for j:=1 to m do

begin

read(x);

if x=0 then

map[i]:=map[i]+(1<<(j-1));

end;

readln();

end;

k:=0;

for i:=0 to 1<

if (1) then

begin

st[k]:=i;

inc(k);

end;

for i:=0 to k-1 do

if not(judge2(1,i)) then

f[1,i]:= (2) ;

for i:=2 to n do

for j:=0 to k-1 do

begin

if judge2(i,j) then continue;

for p:=0 to k-1 do

begin

if (3) then continue;

//剪枝,判断上一行放棋子的方案是否合法 if not((st[j] and st[p])>0) then f[i,j]:= (4) ;

end;

end;

ans:=0;

for i:=0 to k-1 do

ans:= (5) ;

writeln(ans);

end.

相关主题
相关文档
最新文档