NOIP2011提高组解题报告day1

NOIP2011提高组解题报告day1
NOIP2011提高组解题报告day1

NOIP2011提高组解题报告day1

(2011-12-13 09:29:54)

标签:

杂谈

铺地毯

【问题描述】

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标

系的第一象限)铺上一些矩形地毯。一共有n 张地毯,编号从1 到n。现在将这些地毯按照

编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

【输入】

输入文件名为carpet.in。

输入共n+2 行。

第一行,一个整数n,表示总共有n 张地毯。

接下来的n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每

两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x 轴和y 轴方向的长度。

第n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)。

【输出】

输出文件名为carpet.out。

输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。

【输入输出样例】

carpet.in

3

1 0

2 3

0 2 3 3

2 1

3 3

2 2

3

carpet.out

3

【解题报告】

从后往前扫,找到第一个覆盖这个点的就输出,否则无解。

program carpet;

//uses sysutils;

var

n,i,a,b:longint;

x2,x1,y1,y2:array[0..100001]of longint;

//time:extended;

procedure main;

begin

readln(n);

for i:=1 to n do

begin

readln(x1[i],y1[i],a,b);

x2[i]:=x1[i]+a;

y2[i]:=y1[i]+b;

end;

readln(a,b);

for i:=n downto 1 do if (a<=x2[i])and(a>=x1[i])and(b>=y1[i])and(b<=y2[i]) then

begin

writeln(i);

exit;

end;

writeln(-1);

end;

begin

assign(input,'carpet.in');

reset(input);

assign(output,'carpet.out');

rewrite(output);

//time:=now; //当前时间

main;

//writeln((now-time)*24*3600:0:2);//输出程序运行时间

close(input);

close(output);

end.

选择客栈

【问题描述】

丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从1 到n 编号。每家客栈都按照某一种色调进行装饰(总共k 种,用整数0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。

两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。

他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。

【输入】

输入文件hotel.in,共n+1 行。

第一行三个整数n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;接下来的n 行,第i+1 行两个整数,之间用一个空格隔开,分别表示i 号客栈的装饰色调和i 号客栈的咖啡店的最低消费。

【输出】

输出文件名为hotel.out。

输出只有一行,一个整数,表示可选的住宿方案的总数。

【输入输出样例1】

是若选择住4、5 号客栈的话,4、5 号客栈之间的咖啡店的最低消费是4,而两人能承受的最低消费是3 元,所以不满足要求。因此只有前3 种方案可选。

【数据范围】

对于30%的数据,有n≤100;

对于50%的数据,有n≤1,000;

对于100%的数据,有2≤n≤200,000,0

【一句话题意】

合法区间[l,r]定义:l,r的色调相同,且[l,r]之间存在一个最低消费不超过p。求合法区间总数。【考察知识点】

二分查找/枚举

①:O(n^3):

看完题目后不知所云,再多看几遍,一个O(n^3)的算法有了一点雏形。

用两层循环枚举区间的左右端点l、r,再用一层循环判断区间内是否有可行的咖啡店,累计即可。这个算法思维难度和编程难度都非常低,但是只能过30%的数据,可以作为对拍程序备份。

②:O(nk)

再仔细思考,发现题中合法区间的限制条件其实很强。首先区间端点的色调必须相同,其次区间内必须要存在一个咖啡店最低消费不超过P。

因此,如果我们用一层循环枚举左端点,并很快找到右端点的可行数,那么题目就能解决了。这里置答案为变量ans,千万注意类型要为int64

这里首先要用到区间部分和优化。设sum [i,j]为前i个客栈中,色调为j的客栈总数,那么:sum[i,j]=sum[i-1,j] (color[i]<>j)

sum[i,j]=sum[i-1,j]+1 (color[i]=j)

这里要用O(NK)的复杂度,是算法的瓶颈所在,不过对于题中的数据范围已经足够了。并且具体实现可以先用数组赋值sum[i]=sum[i-1],然后再为sum[i,color[i]]+1,应该会快很多。我们还需要解决的问题就是,已知了L,如何快速找到R的可行范围?

再次注意区间内必须要存在一个咖啡店最低消费不超过P。

因此,如果L就是一个最低消费不超过P的咖啡店,那么R可以取到[L+1,n]中所有色调为color[L]的客栈,即ans=ans+sum[n,color[L]]-sum[L,color[L]];

如果L是一个最低消费超过P的咖啡店,那么我们要找到一个T∈[L+1,n],且咖啡店T的最低消费不超过P,那么R就可以取到[T,n]中所有色调为color[L]的客栈,即

ans=ans+sum[n,color[L]]-sum[T-1,color[L]] 。

问题是我们如何找到这个T,其实很简单,二分查找即可。再次预设一个数组,保存所有最低消费不超过P的咖啡店序号,二分查找L即可。注意这里L一定不存在这个数组中,因此找到的应该是最靠近L且大于L的序号,细节处理很重要。找不到返回-1,不用累加ans 就是了。

③:O(nlogn)

这个办法比②更优一些。来自Clarkok的做法。

用list[i,j]表示颜色为i的第j个客栈,也就是将客栈按照颜色紧缩存储。另用pos[i]表示第i 个旅馆在list[color[i]]中的位置。用线段树/ST算法(推荐)预处理出区间消费的最小值,也就是min{cost[i..j]},易得到min[k,i]是非增的,注意这是后面二分的关键。

然后枚举第二个人,在list[color[i]]中用二分找到一个j满足min[j,i]<=P,那么ans=ans+j,因为list[color[i],1..j]中必然都是颜色为color[i],且区间最小值也都<=P。

④:O(n)

这应该是最优算法了,无论从空间、时间、编程复杂度方面来说。

这个算法转自上善若水

记f(i)为第1~i的客栈中,编号最大的最低消费小于p的旅馆编号;r(i)为1~i-1号旅馆中,编号最大的与第i号旅馆色调相同的旅馆编号,count1(i)为第1~i-1号旅馆中与第i号旅馆色调相同旅馆数目,count2(i)为第1~i-1号旅馆中与第i号旅馆色调相同,且到第i号旅馆的路上存在最低消费不大于p的旅馆的旅馆数目。

(I)若f(i)

(II)若f(i)>=r(i),那么第1~r(i)号旅馆中,所有与第i号旅馆色调相同的旅馆到第i号旅馆的路上必然存在一个旅馆的最低消费不大于p。故此时count2(i)=count1(i)。

从1到n扫描一次即可,时间复杂度O(n)。具体实现时可以将数组压缩,空间复杂度O(k)。【时间复杂度】

最低O(n)

//O(nk)

program hotel;

//uses sysutils;

const

proname='hotel';

type

kezhan=record

color,cost:longint;

end;

var

fin,fout:text;

i,j,k,l,r,m,n,x,y,s,t:longint;

a:array[-10..200100]of kezhan;

sum:array[-10..200100,-10..60]of longint;

colorsum,mincost:longint;

cafe:array[-10..200100]of longint;

v:array[-10..200100]of boolean;

ans:int64;

procedure pin;

var

i,j,k:longint;

begin

readln(fin,n,colorsum,mincost);

fillchar(a,sizeof(a),0);

for i:=1 to n do

readln(fin,a[i].color,a[i].cost);

end;

function find(x:longint):longint;

var

i,j,k,mid:longint;

begin

l:=1;

r:=s;

find:=-1;

repeat

mid:=(l+r) shr 1;

if x<=cafe[mid] then

begin

r:=mid-1;

find:=cafe[mid];

end

else

l:=mid+1;

until l>r;

end;

procedure main;

var

i,j,k:longint;

begin

for i:=0 to colorsum-1 do

sum[0,i]:=0;

for i:=1 to n do

begin

sum[i]:=sum[i-1];

sum[i,a[i].color]:=sum[i-1,a[i].color]+1; end;

s:=0;

fillchar(cafe,sizeof(cafe),0);

fillchar(v,sizeof(v),false);

for i:=1 to n do

if a[i].cost<=mincost then

begin

inc(s);

cafe[s]:=i;

v[i]:=true;

end;

ans:=0;

for i:=1 to n-1 do //mei ju di yi ge ren

begin

if v[i] then

begin

ans:=ans+(sum[n,a[i].color]-sum[i,a[i].color]); end

else

begin

j:=find(i);

if j=-1 then exit;

ans:=ans+(sum[n,a[i].color]-sum[j-1,a[i].color]); end;

end;

end;

procedure pout;

var

i,j,k:longint;

begin

writeln(fout,ans);

end;

begin

assign(fin,proname+'.in');

assign(fout,proname+'.out');

reset(fin);

rewrite(fout);

//time:=now;

pin;

main;

pout;

//writeln(fout,(now-time)*24*3600*1000:0:0);

close(fin);

close(fout);

end.

mayan 游戏

【问题描述】

Mayan puzzle 是最近流行起来的一个游戏。游戏界面是一个7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:

1、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见下面图1 和图2);

2、任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除(参见图1 到图3)。

注意:

a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图4,三个颜色为

1 的方块和三个颜色为

2 的方块会同时被消除,最后剩下一个颜色为2 的方块)。

b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有方块会被同时消除(例如下面图5 所示的情形,5 个方块会同时被消除)。

3、方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。注意:掉落的过程中将不会有方块的消除。上面图 1 到图3 给出了在棋盘上移动一块方块之后棋盘的变化。棋盘的左下角方块的坐标为(0, 0),将位于(3, 3)的方块向左移动之后,游戏界面从图1 变成图2 所示的状态,此时在一竖列上有连续三块颜色为4 的方块,满足消除条件,消除连续3 块颜色为4 的方块后,上方的颜色为3 的方块掉落,形成图3 所示的局面。

【输入】

输入文件mayan.in,共6 行。

第一行为一个正整数n,表示要求游戏通关的步数。

接下来的 5 行,描述7*5 的游戏界面。每行若干个整数,每两个整数之间用一个空格隔开,每行以一个0 结束,自下向上表示每竖列方块的颜色编号(颜色不多于10 种,从1 开始顺序编号,相同数字表示相同颜色)。输入数据保证初始棋盘中没有可以消除的方块。

【输出】

输出文件名为mayan.out。

如果有解决方案,输出n 行,每行包含3 个整数x,y,g,表示一次移动,每两个整数之间用一个空格隔开,其中(x,y)表示要移动的方块的坐标,g 表示移动的方向,1 表示向右移动,-1 表示向左移动。注意:多组解时,按照x 为第一关健字,y 为第二关健字,1优先于-1,给出一组字典序最小的解。游戏界面左下角的坐标为(0,0)。如果没有解决方案,输出一行,包含一个整数-1。

按箭头方向的顺序分别为图 6 到图11

样例输入的游戏局面如上面第一个图片所示,依次移动的三步是:(2,1)处的方格向右移动,(3,1)处的方格向右移动,(3,0)处的方格向右移动,最后可以将棋盘上所有方块消除。

【数据范围】

对于30%的数据,初始棋盘上的方块都在棋盘的最下面一行;

对于100%的数据,0 < n≤5。

【一句话题意】

给定一个存在重力的矩阵,每次只能向左或右交换方块,连续3个或以上的方块群会被消除。求操作次数为N时的操作步骤。

【考察知识点】

DFS

【思路】

第一页描述这题每个测试点时间限制是3S马上确定这是搜索题目,抛弃所有动规贪心等等。然后锁定DFS,因为题中已经限定搜索深度,BFS是自找MLE。

再确定状态存储方式,我是将输入逆时针转90°后用数组保存,因此坐标之类的要特别注意。然后,然后就没什么特别的了,搜素顺序题目已经给了。

设过程down(i),表示将第i列的所有方块下沉。设函数clear,分行列清空后返回是否可以清空,这里用到连续区间指针l、r优化,类似前向星分组时的操作。于是:

while clear do

for i:=1 to 5 do

down(i);

注意在此之前如果有方块一交换就往下掉,那么就down交换的那两列。

表示码了200多行代码用了半小时,调试几乎用了1小时,那叫一个蛋疼。。。。

根据我的CCF测评分数可以看出,爆搜只能过50分,若常数小一点可以过80分。回家后我稍微修改了一下代码,用上了WJMZBMR的前两个剪枝,最后一个点在家里的电脑上跑了2s,其他点轻松通过了。

下面附加几个剪枝

左右交换是等价的,根据题中的顺序,只需向右交换即可

某个颜色方块的数量<=2,则很显然不能被消除

掉落不能改变方块的列,因此某列l1上某颜色方块数量∈[1,2],则必须通过交换来从其他列l2得到方块。取一个l1,且l2最远,设这个距离为Di,那么必须要把多有颜色的Di消到0。而一次操作最多减少两个颜色的Di,因此最少操作次数为:max{max{Di}(1<=i<=10),(sum(Di)(1<=i<=10)+1)/2}

设个变量掐时,大概快超时的时候直接输出-1

【时间复杂度】

O(k(4*7)^5)

program mayan;

//uses sysutils;

const

proname='mayan';

game=record

data:array[0..8,0..6]of longint;

end;

var

fin,fout:text;

i,j,k,l,r,m,n,x,y,s,t,ans:longint;

first:game;

b:array[0..10]of game;

caozuo:array[0..10,0..3]of longint; tt:array[0..8,0..6]of longint;

cut:array[0..11]of longint;

procedure pin;

var

i,j,k:longint;

begin

readln(fin,n);

fillchar(first,sizeof(first),0);

for j:=1 to 5 do

begin

i:=8;

repeat

read(fin,k);

if k=0 then break;

dec(i);

first.data[i,j]:=k;

until false;

readln(fin);

end;

end;

procedure swap(x,x1,y1,x2,y2:longint); var

t:longint;

begin

t:=b[x].data[x1,y1];

b[x].data[x1,y1]:=b[x].data[x2,y2]; b[x].data[x2,y2]:=t;

end;

function ok(x:longint):boolean;

var

i,j,k:longint;

ok:=true;

for i:=1 to 5 do

if b[x].data[7,i]<>0 then

exit(false);

end;

procedure down(x,lie:longint);

var

i,j,k:longint;

begin

for i:=6 downto 1 do

if (b[x].data[i,lie]<>0)and(b[x].data[i+1,lie]=0) then

begin

for k:=7 downto 1 do

if b[x].data[k,lie]=0 then

break;

swap(x,i,lie,k,lie);

end;

end;

function clear(x:longint):boolean;

var

i,j,k:longint;

l,r:longint;

step:longint;

begin

fillchar(tt,sizeof(tt),0);

l:=0;

r:=0;

step:=x;

clear:=false;

for i:=1 to 7 do

begin

for j:=1 to 5 do

if b[x].data[i,j]<>b[x].data[i,j-1] then

begin

r:=j-1;

if (l<>0)and(r-l+1>=3)and(b[x].data[i,l]<>0) then begin

for k:=l to r do

tt[i,k]:=1;

clear:=true;

end;

l:=j;

end;

if (5-l+1>=3)and(b[x].data[i,5]<>0) then

begin

for k:=l to 5 do

tt[i,k]:=1;

clear:=true;

end;

end;

l:=0;

r:=0;

for i:=1 to 5 do

begin

for j:=1 to 7 do

if b[x].data[j,i]<>b[x].data[j-1,i] then

begin

r:=j-1;

if (l<>0)and(r-l+1>=3)and(b[x].data[l,i]<>0) then

begin

for k:=l to r do

tt[k,i]:=1;

clear:=true;

end;

l:=j;

end;

if (7-l+1>=3)and(b[x].data[l,i]<>0)and(b[x].data[7,i]<>0) then begin

for k:=l to 7 do

tt[k,i]:=1;

clear:=true;

end;

end;

for i:=1 to 7 do

for j:=1 to 5 do

if tt[i,j]=1 then

b[x].data[i,j]:=0;

end;

procedure dfs(step:longint);

var

i,j,k:longint;

begin

if step=n+1 then

begin

if ok(n+1) then

begin

for i:=1 to n do

writeln(fout,caozuo[i,1],' ',caozuo[i,2],' ',caozuo[i,3],' ');

close(fin);

close(fout);

halt;

end;

exit;

end;

//剪枝2

fillchar(cut,sizeof(cut),0);

for i:=1 to 5 do

for j:=1 to 7 do

inc(cut[b[step].data[j,i]]);

for i:=1 to 10 do

if (cut[i]=1)or(cut[i]=2) then

exit;

b[step+1]:=b[step];

for i:=1 to 4 do

for j:=7 downto 1 do

//剪枝1 这里有一个问题,即第一层为01101且操作数为1时,必须要向右移 //因此这个剪枝需要稍加修改,这段程序不能AC!!!

if (b[step+1].data[j,i]<>b[step+1].data[j,i+1]) then

begin

swap(step+1,j,i,j,i+1);

down(step+1,i+1);

down(step+1,i);

while clear(step+1) do

for k:=1 to 5 do

down(step+1,k);

caozuo[step,1]:=i-1;

caozuo[step,2]:=7-j;

caozuo[step,3]:=1;

dfs(step+1);

b[step+1]:=b[step];

end;

end;

procedure main;

var

i,j,k:longint;

begin

fillchar(b,sizeof(b),0);

fillchar(caozuo,sizeof(caozuo),0);

b[1]:=first;

dfs(1);

end;

procedure pout;

var

i,j,k:longint;

begin

writeln(fout,-1);

end;

begin

assign(fin,proname+'.in');

assign(fout,proname+'.out');

reset(fin);

rewrite(fout);

//time:=now;

pin;

main;

pout;

//writeln(fout,(now-time)*24*3600*1000:0:0); close(fin);

close(fout);

end.

分享分享到新浪Q

棋盘解题报告(noip2017普及组第三题)

棋盘解题报告(noip2017普及组第三题)上次写了Linux用vim进行C++编程的配置和操作入门后,今天再给棋盘写个解题报告试试。 题目描述 有一个m ×m的棋盘,棋盘上每一个格子可能是红色、黄色或没有任何颜色的。你现在要从棋盘的最左上角走到棋盘的最右下角。 任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的),你只能向上、下、左、右四个方向前进。当你从一个格子走向另一个格子时,如果两个格子的颜色相同,那你不需要花费金币;如果不同,则你需要花费1 个金币。另外,你可以花费2 个金币施展魔法让下一个无色格子暂时变为你指定的颜色。但这个魔法不能连续使用,而且这个魔法的持续时间很短,也就是说,如果你使用了这个魔法,走到了这个暂时有颜色的格子上,你就不能继续使用魔法;只有当你离开这个位置,走到一个本来就有颜色的格子上的时候,你才能继续使用这个魔法,而当你离开了这个位置(施展魔法使得变为有颜色的格子)时,这个格子恢复为无色。 现在你要从棋盘的最左上角,走到棋盘的最右下角,求花费的最少金币是多少?输入输出格式 输入格式:

数据的第一行包含两个正整数m,n,以一个空格分开,分别代表棋盘的大小,棋盘上有颜色的格子的数量。 接下来的n 行,每行三个正整数x,y,c,分别表示坐标为(x,y)的格子有颜色c。 其中c=1 代表黄色,c=0 代表红色。相邻两个数之间用一个空格隔开。棋盘左上角的坐标为(1, 1),右下角的坐标为(m, m)。 棋盘上其余的格子都是无色。保证棋盘的左上角,也就是(1,1)一定是有颜色的。 输出格式: 输出一行,一个整数,表示花费的金币的最小值,如果无法到达,输出-1。输入输出样例 输入样例#1: 5 7 1 1 0 1 2 0 2 2 1 3 3 1 3 4 0 4 4 1 5 5 0 输出样例#1: 8 输入样例#2: 5 5

NOIP2011普及组复赛(试题+源程序)

NOIP2011 普及组复赛 1 .数字反转(reverse.cpp/c/pas ) 【问题描述】 给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为 零,否则反转后得到的新数的最高位数字不应为零。(参见样例2) 【输入】 输入文件名为reverse. in 。 输入共一行,一个整数No 【输出】 输出文件名为reverse.out 。 输出共1行,一个整数,表示反转后的新数。 【输入输出样例1】 -1,000,000,000 < N< 1,000,000,000 。 【解题】这道题非常简单,可以读字符串处理,也可以读数字来处理,只不过要注意符号问题(以及但测试数据没出)。 -0 , 【法一】字符串处理 Var i,l,k:i nteger; s:stri ng; p:boolea n; begin assig n(i nput, 'reverse.i n'); reset(i nput); assig n(o utput, 'reverse.out'); rewrite(output); readl n( s); l:=le ngth(s); k:=1; if s[1]=' -' the n begin write('-'); k:=2; en d; p:=true;; for i:=l dow nto k do begin if(p)a nd((s[i]='0')) the n continue else begin write(s[i]); p:=false;; en d; en d; close(i nput); close(output); en d. 【法二】数字处理 Var f:i nteger; n,an s:lo ngint; begin assig n(i nput, 'reverse.i n'); reset(i nput); assig n(o utput, 'reverse.out'); rewrite(output); readl n(n); if n<0 the n begin f:=-1; n :=-n;

noip2014普及组复赛题解

1.珠心算测验 注意看清题意:其中有多少个数,恰好等于集合中另外两个(不同 的)数之和。这样的题意加上100的规模,建议暴力3个for: #include #include #include #include using namespace std; int n; int a[105]; int main(){ freopen("count.in","r",stdin); freopen("count.out","w",stdout); scanf("%d",&n); for(int i=1; i<=n; i++){ scanf("%d",&a[i]); } sort(a+1,a+n+1); int res=0; for(int i=1; i<=n; i++){ int ok=0; for(int j=1; j<=n && !ok; j++) if(j!=i){ for(int k=1; k<=n && !ok; k++) if(a[k]!=a[j]){ if(a[j]+a[k]==a[i]) ok=1; } } res+=ok; } printf("%d\n",res); return 0; } 2.比例简化 L很小,还是枚举,然后比较的话建议用乘法比较,避免精度问题:#include #include #include using namespace std; int A,B,L; int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); } int main(){ freopen("ratio.in","r",stdin); freopen("ratio.out","w",stdout); scanf("%d%d%d",&A,&B,&L); int ba=1000000,bb=1; for(int i=1; i<=L; i++){ for(int j=1; j<=L; j++){ if(gcd(i,j)==1 && i*B>=j*A){

noip2011初赛试题及答案(完美Word版)

第十七届全国青少年信息学奥林匹克联赛初赛试题 (提高组 Pascal语言两小时完成) ●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●● 一、单项选择题(共20题,每题1.5分。共计30分。每题有且仅有一个正确选项。) B 1.在二进制下,1100011 +()= 1110000。 A.1011 B.1101 C.1010 D.1111 B 2.字符“A”的ASCII码为十六进制41,则字符“Z”的ASCII码为十六进制的()。A.66 B.5A C.50 D.视具体的计算机而定 A 3.右图是一棵二叉树,它的先序遍历是()。 A.ABDEFC B.DBEFAC C.DFEBCA D.ABCDEF D 4.寄存器是()的重要组成部分。 A.硬盘B.高速缓存C.内存D.中央处理器(CPU) B 5.广度优先搜索时,需要用到的数据结构是()。 A.链表B.队列C.栈D.散列表 A 6.在使用高级语言编写程序时,一般提到的“空间复杂度”中的“空间”是指()。 A.程序运行时理论上所占的内存空间 B.程序运行时理论上所占的数组空间 C.程序运行时理论上所占的硬盘空间 D.程序源文件理论上所占的硬盘空间 C 7.应用快速排序的分治思想,可以实现一个求第K大数的程序。假定不考虑极端的最坏情况,理论上可以实现的最低的算法时间复杂度为()。 A.O(n2)B.O(n log n)C.O(n) D.O(1) D 8.为解决Web应用中的不兼容问题,保障信息的顺利流通,()制定了一系列标准,涉及HTML、XML、CSS等,并建议开发者遵循。 A.微软 B.美国计算机协会(ACM) C.联台国教科文组织D.万维网联盟(W3C)

NOIP2015普及组解题报告

NOIP2015 普及组解题报告 From 贴吧id u007zzt 金币 国王将金币作为工资,发放给忠诚的骑士。 第一天骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天,每天收到四枚金币,以此类推;这种工资发放模式会一直延续下去,当连续N天收到N枚金币后,骑士会在之后的N+1天,每天收到N+1枚金币。 请计算前K天里,骑士一共获得了多少金币。 输入格式 输入包含一个正整数K,表示发放金币的天数。 输出格式 输出一个正整数,即骑士收到的金币数。 样例1 样例输入1 6 样例输出1 14 样例2 样例输入2 1000 样例输出2 29820 对于全部数据,1≤K≤10000。 这种题目,简直就属于水题狂做的那种。不多说,附C++代码。 #include "stdio.h" int k,ans=0; int main(){ freopen("coin.in","r",stdin); freopen("coin.out","w",stdout); scanf("%d",&k); int i=1; while(k){ if(k>=i){ ans+=i*i; k-=i; }else{ ans+=k*i; k=0;

} i++; } printf("%d\n",ans); return 0; } 扫雷游戏 扫雷游戏是一款十分经典的单机小游戏。 在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。 玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。 游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。 注:一个格子的周围格子包括其上、下、左、右、左上、左下、右上、右下八个方向上与之直接相邻的格子。 输入格式 第一行用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。 接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符?'表示相应的格子是地雷格,字符(?)`表示相应的格子是非地雷格子。相邻字符之间无分隔符。 输出格式 输出文件包括n行,每行m个字符,描述了整个雷区。用?表示地雷格,用周围地雷格数表示非地雷格。相邻字符之间无分隔符。 样例1 样例输入1 3 3 *?? ??? ?*? 样例输出1 *10 221 1*1 样例2 样例输入2 2 3 ?*? *?? 样例输出2 2*1 *21

NOIP普及组复赛解题报告

NOIP2015 普及组解题报告 南京师范大学附属中学树人学校CT 1.金币(coin.cpp/c/pas) 【问题描述】国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金 币;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金 币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。 请计算在前K 天里,骑士一共获得了多少金币。【输入格式】 输入文件名为coin.in 。 输入文件只有1行,包含一个正整数K,表示发放金币的天数。 【输出格式】 输出文件名为coin.out。 输出文件只有1 行,包含一个正整数,即骑士收到的金币数。 【数据说明】 对于100%的数据,1 < K < 10,000 【思路】 模拟 【时空复杂度】 O(k) ,O(1) 2 、扫雷游戏(mine.cpp/c/pas ) 【问题描述】

扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。 【输入格式】 输入文件名为mine.in 。 输入文件第一行是用一个空格隔开的两个整数n和m分别表示雷区的行数和列数。 接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符’* '表示相应格子是地雷格,字符' ?'表示相应格子是非地雷格。相邻字符之间无分隔符。【输出格式】输出文件名为mine.out 。 输出文件包含n行,每行m个字符,描述整个雷区。用’* '表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。 【数据说明】 对于100% 的数据,1< n W 1Q01< me 100 【思路】 模拟 【技巧】 可将数组多开一圈,省去边界条件的判断 【时空复杂度】 O(mn),O(mn)

NOIP2015普及组复赛解题报告

精心整理 NOIP2015普及组解题报告 南京师范大学附属中学树人学校CT 1.金币(coin.cpp/c/pas) 【问题描述】 国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天) 放模式会一直这样延续下去:当连续N 续N+1天里,每天收到N+1枚金币。 请计算在前K 【输入格式】 输入文件名为coin.in。 输入文件只有1 【数据说明】 对于100%的数据,1≤K≤10,000。 【思路】 模拟 【时空复杂度】 O(k),O(1)

2、扫雷游戏(mine.cpp/c/pas) 【问题描述】 扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m 向上与之直接相邻的格子。 【输入格式】 输入文件名为mine.in。 接下来n行,每行m 雷个数表示非地雷格。相邻字符之间无分隔符。 【数据说明】 对于100%的数据,1≤n≤100,1≤m≤100。 【思路】 模拟 【技巧】

可将数组多开一圈,省去边界条件的判断。【时空复杂度】 O(mn),O(mn)

3.求和(sum.cpp/c/pas) 【问题描述】 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色color i(用[1,m]当中的一个整数表示),并且写了一个数字number i。 定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件: 1.x,y,z都是整数,x

noip2011 初赛普及组c++试题及答案

NOIP2011 (普及组 C++语言二小时完成) ●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●● 一、单项选择题(共20题,每题1.5分,共计30分。每题有且仅有一个正确选项。) 1.在二进制下,1011001 + ()= 1100110。 A.1011 B.1101 C.1010 D.1111 2.字符“0”的ASCII码为48,则字符“9”的ASCII码为()。 A.39 B.57 C.120 D.视具体的计算机而定 3.一片容量为8G的SD卡能储存大约()张大小为2MB的数码照片。 A.1600 B.2000 C.4000 D.16000 4.摩尔定律(Moore's law)是由英特尔创始人之一戈登·摩尔(Gordon Moor)提出来的。根据摩尔定律,在过去几十年一级在可预测的未来纪念,单块集成电驴的集成度大约每()个月翻一番。A.1 B.6C.18 D.36 5.无向完全图是图中每对顶点之间都恰好有一条边的简单图。已知无向完全图G有7个顶点,则它共有()条边。 A.7 B.21 C.42 D.49 6.寄存器是()的重要组成部分。 A.硬盘B.高速缓存C.内存D.中央处理器(CPU) 7.如果根结点的深度记为1,则一棵恰有2011个叶结点的二叉树的深度最少是()。 A.10 B.11 C.12 D.13 8.体育课的铃声响了,同学们都陆续地奔向操场,按老师的要求从高到矮站成一排。每个同学按顺序来到操场时,都从排尾走到排头,找到第一个比自己高的同学,并站在他的后面。这种站队的方法类似于()算法。 A.快速排序B.插入排序C.冒泡排序D.归并排序 9.一个正整数在二进制下有100位,则它在十六进制下有()位。 A.7 B.13 C.25 D.不能确定 10.有人认为,在个人电脑送修前,将文件放入回收站中就是已经将其删除了。这种想法是()。 A.正确的,将文件放入回收站以为着彻底删除、无法恢复 B.不正确的,只有将回收站清空后,才意味着彻底删除、无法恢复 C.不正确的,即使回收站清空,文件只是被标记为删除,仍可能通过回复软件找回 D.不正确的,只要在硬盘上出现过的文件,永远不可能被彻底删除

noip2017提高组复赛解题报告

noip2017提高组复赛解题报告 定期推送帐号信息学新闻,竞赛自主招生,信息学专业知识,信息学疑难解答,融科教育信息学竞赛培训等诸多优质内容的微信平台,欢迎分享文章给你的朋友或者朋友圈!以下解题思路及代码未经官方评测,仅供参考,复赛成绩以官方(CCF)评测结果为准。 Day1 1.小凯的疑惑(math.cpp/c/pas)【问题描述】小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品。【输入格式】输入文件名为math.in。输入数据仅一行,包含两个正整数a 和b,它们之间用一个空格隔开,表示小凯手中金币的面值。【输出格式】输出文件名为math.out。输出文件仅一行,一个正整数N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。【输入输出样例1】math.in3 7 math.out11【数据规模与约定】对于30%的数据: 1 ≤a,b ≤50。对于60%的数据: 1 ≤a,b ≤10,000。对于100%的数据:1 ≤a,b ≤1,000,000,000。数学太差只找规律吧。

设:其中一个数为2则:2、3=>1;2、5=>3;2、7=>5;2、11=>9得:2、n=>n-2设:其中一个数为3则:3、5=>7;3、7=>11;3、11=>19;3、13=>23得:3、n=>2n-3设:其中一个数为5则:5、7=>23;5、11=>39;5、13=>47;5、17=>63得:5、n=>4n-5所以:m、n=>(m-1)n-m #includeusing namespace std;int main(){ long long a,m,n; scanf('%lld %lld',&m,&n); a=(m-1)*n-m; printf('%lld',a); return 0;} 2.时间复杂度(complexity.cpp/c/pas)【问题描述】小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。A++语言的循环结构如下:其中“F i x y”表示新建变量(i 变量i 不可与未被销毁的变量重名)并初始化为x,然后判断i 和y 的大小关系,若i 小于等于y 则进入循环,否则不进入。每次循环结束后i都会被修改成i +1,一旦i 大于y 终止循环。x和y 可以是正整数(x 和y 的大小关系不定)或变量n。n 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于100。“E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。注:本题中为了书写方便,在描述复杂度时,使用大

NOIP2011普及组

数字反转题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形 式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。【数据范围】 -1,000,000,000 ≤ N≤ 1,000,000,000。 输入格式 输入共 1 行,一个整数N。 输出格式 输出共 1 行,一个整数,表示反转后的新数。 样例输入: 123 -380 样例输出: 321 -83 统计单词数题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位 置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章 中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。 【数据范围】 1 ≤ 单词长度≤ 10。 1 ≤ 文章长度≤ 1,000,000。 【输入输出样例 1 说明】 输出结果表示给定的单词To 在文章中出现两次,第一次出现的位置为0。 【输入输出样例 2 说明】 表示给定的单词to 在文章中没有出现,输出整数-1。 输入格式 第 1 行为一个字符串,其中只含字母,表示给定单词; 第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式 只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开, 分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字 母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。 样例输入: [sample 1] To to be or not to be is a question [sample 2] to Did the Ottoman Empire lose its power at that time 样例输出: [sample 1] 2 0 [sample 2] -1 瑞士轮题目描述 2*N名编号为1~2N的选手共进行R轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前。 每轮比赛的对阵安排与该轮比赛开始前的排名有关:第1名和第2名、第3名和第4名、……、第2K-1名和第2K名、……、第2N-1名和第2N名,各进行一场比赛。每场比赛胜者得1分,负者得0分。也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。 现给定每个选手的初始分数及其实力值,试计算在R轮比赛过后,排名第Q的选手编号是多少。我 们假设选手的实力值两两不同,且每场比赛中实力值较高的总能获胜。 输入格式 输入的第一行是三个正整数N、R、Q,每两个数之间用一个空格隔开,表示有2*N名选手、R轮比赛,以及我们关心的名次Q。 第二行是2*N个非负整数s1,s2,…,s2N,每两个数之间用一个空格隔开,其中si表示编号为i 的选手的初始分数。 第三行是2*N个正整数w1,w2,…,w2N,每两个数之间用一个空格隔开,其中wi表示编号为i 的选手的实力值。 输出格式

NOIP2017普及组复赛-解题报告

NOIP2017普及组复赛-解题报告 衢州市兴华中学 By 冯明浩 Score 成绩 题目大意 给出三个整十数A,B,C ,求A*20%+B*30%+C*50%的值 考察算法 模拟 算法一 直接粗暴地输出A*0.2+B*0.3+C*0.5 时间复杂度:O(1) 期望得分:100 算法二 由于分数均为整十数,先将分数各除以10,再直接输A*2+B*3+C*5。这样就避免了精度问题 时间复杂度:O(1) 期望得分:100 librarian 图书管理员 题目大意 给出N 个数Ai ,再进行Q 次询问,找后缀为给定数Bi 的最小的Ai 考察算法 模拟 算法一 将Ai 及Bi 都转化成字符串。每次询问都对N 个数进行后缀比较,挑出个最小的 时间复杂度:O(N*Q*len) 期望得分:80 算法二 对算法一的比较进行优化——构造出n 10,对于Ai ,直接Ai Mod 10len ,判断是否 相等。这样每次比较的时间复杂度优至O(1) 同时先将Ai 排序,再每次从小到大查询,一旦找到就停 时间复杂度:小于O(N*Q)(一般情况) 期望得分:100 算法三 读入Ai 时进行处理,构造ans[x]数组,记录询问X 的最小值。对于每个Ai ,依次 取出其后1、2、3……len 位,修正其的最小值。这样每次查询,就可以O (1)出结 果了 时间复杂度:O(N*len) 空间复杂度:O(max(Bi)) 期望得分:100 Chess 棋盘 题目大意 给出一个N*N 的矩阵,其中部分格有颜色 每次可以从一个格向上下左右四个方向移动一格(不能越出矩阵且满足条件),根据 两个格子的颜色有不同的代价 求从左上角走至右下角的最小代价 考察算法 最短路(动态规划) 算法一 直接暴力地按照题意进行DFS 时间复杂度:O(n n *2) 期望得分:30 算法二 以左上角为起点,右下角为终点,刷四个方向的SPFA

noip2015普及组题解最终分解

本次试题前2题比较简单,34题容易拿到部分分,但满分有难度1. 金币 (coin.cpp/c/pas) 【问题描述】 国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。 请计算在前K天里,骑士一共获得了多少金币。 【输入格式】 输入文件名为coin.in。 输入文件只有1行,包含一个正整数K,表示发放金币的天数。 【输出格式】 输出文件名为coin.out。 输出文件只有1行,包含一个正整数,即骑士收到的金币数。 【样例输入】coin.in 6 【样例输出】coin.out 14 【输入输出样例1说明】 骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到1+2+2+3+3+3=14枚金币。 【数据范围】对于100%的数据,1 ≤K ≤10,000。 【题解】 关注到K的范围是10000后,就不需要考虑数学公式,纯模拟就行,考点就是for循环了 var i,j,count,n,ans:longint; begin assign(input,'coin.in');reset(input); assign(output,'coin.out');rewrite(output); readln(n); for i:=1 to 1000 do for j:=1 to i do begin inc(count); inc(ans,i); if count=n then begin writeln(ans); close(input);close(output); halt;

NOIP普及组初赛历年试题及答案选择题篇

NOIP普及组初赛历年试题及答案选择题篇 单项选择题:每次共20题,每题1.5分,共计30分。每题有且仅有一个正确选项。注:答案在文末 一、计算机基础(每年8-10题,占选择题的一半,找份材料翻几遍就可拿分了) NOIP2011-3. 一片容量为8G的SD卡能储存大约( )张大小为2MB的数码照片。 A.1600 B.2000 C.4000 D.16000 NOIP2011-4. 摩尔定律(Moore'slaw)是由英特尔创始人之一戈登·摩尔(GordonMoor)提出来的。根据摩尔定律,在过去几十年一级在可预测的未来纪念,单块集成电路的集成度大约每( )个月翻一番。 A.1 B.6 C.18 D.36 NOIP2011-6.寄存器是( )的重要组成部分。 A.硬盘 B.高速缓存 C.内存 D.中央处理器(CPU) NOIP2011-10. 有人认为,在个人电脑送修前,将文件放入回收站中就是已经将其删除了。这种想法是( )。 A .正确的,将文件放入回收站以为着彻底删除、无法恢复 B.不正确的,只有将回收站清空后,才意味着彻底删除、无法恢复 C.不正确的,即使回收站清空,文件只是被标记为删除,仍可能通过回复软件找回 D.不正确的,只要在硬盘上出现过的文件,永远不可能被彻底删除 NOIP2011-14. 生物特征识别,是利用人体本身的生物特征进行身份认证的一种技术。目前,指纹识别、虹膜识别、人脸识别等技术已广泛应用于政府、银行、安全防卫等领域。以下不属于生物特征识别技术及其应用的是( )。

NOIP2011-16. 关于汇编语言,下列说法错误的是( )。 A.是一种与具体硬件相关的程序设计语言 B.在编写复杂程序时,相对于高级语言而言代码量较大,且不易调试 C.可以直接访问寄存器、内存单元、以及I/O端口 D.随着高级语言的诞生,如今已完全被淘汰,不再使用 NOIP2011-18. 1956年( )授予肖克利、巴丁和布拉顿,以表彰他们对半导体的研究和晶体管效应的发现。 A.诺贝尔物理学奖 B.约翰·冯·诺依曼奖 C.图灵奖 D.高德纳奖 NOIP2011-20. 从ENIAC到当前最先进的计算机,冯·诺依曼体系结构始终占有重要地位。冯诺依曼体系结构的核心内容是( )。 A.采用开关电路 B.采用半导体器件 C.采用存储程序和程序控制原理 D.采用键盘输入 NOIP2012-1. 计算机如果缺少( ),将无法正常启动。 A.内存 B.鼠标 C.U盘 D.摄像头

noip普及组复赛解题报告

N O I P2015普及组解题报告 南京师范大学附属中学树人学校CT 1.金币(coin.cpp/c/pas) 【问题描述】 国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。 请计算在前K天里,骑士一共获得了多少金币。 【输入格式】 输入文件名为coin.in。 输入文件只有1行,包含一个正整数K,表示发放金币的天数。 【输出格式】 输出文件名为coin.out。 输出文件只有1行,包含一个正整数,即骑士收到的金币数。 【数据说明】 对于100%的数据,1≤K≤10,000。 【思路】 模拟 【时空复杂度】

O(k),O(1)

2、扫雷游戏(mine.cpp/c/pas) 【问题描述】 扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。 注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。 【输入格式】 输入文件名为mine.in。 输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。 接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。 【输出格式】 输出文件名为mine.out。 输出文件包含n行,每行m个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。 【数据说明】

NOIP普及组初赛历年试题及标准答案选择题篇

NOIP普及组初赛历年试题及答案选择题篇

————————————————————————————————作者:————————————————————————————————日期:

NOIP普及组初赛历年试题及答案选择题篇 单项选择题:每次共20题,每题1.5分,共计30分。每题有且仅有一个正确选项。注:答案在文末 一、计算机基础(每年8-10题,占选择题的一半,找份材料翻几遍就可拿分了) NOIP2011-3. 一片容量为8G的SD卡能储存大约( )张大小为2MB的数码照片。 A.1600 B.2000 C.4000 D.16000 NOIP2011-4. 摩尔定律(Moore'slaw)是由英特尔创始人之一戈登·摩尔(GordonMoor)提出来的。根据摩尔定律,在过去几十年一级在可预测的未来纪念,单块集成电路的集成度大约每( )个月翻一番。 A.1 B.6 C.18 D.36 NOIP2011-6.寄存器是( )的重要组成部分。 A.硬盘 B.高速缓存 C.内存 D.中央处理器(CPU) NOIP2011-10. 有人认为,在个人电脑送修前,将文件放入回收站中就是已经将其删除了。这种想法是( )。 A .正确的,将文件放入回收站以为着彻底删除、无法恢复 B.不正确的,只有将回收站清空后,才意味着彻底删除、无法恢复 C.不正确的,即使回收站清空,文件只是被标记为删除,仍可能通过回复软件找回 D.不正确的,只要在硬盘上出现过的文件,永远不可能被彻底删除

NOIP2011-14. 生物特征识别,是利用人体本身的生物特征进行身份认证的一种技术。目前,指纹识别、虹膜识别、人脸识别等技术已广泛应用于政府、银行、安全防卫等领域。以下不属于生物特征识别技术及其应用的是( )。 NOIP2011-16. 关于汇编语言,下列说法错误的是( )。 A.是一种与具体硬件相关的程序设计语言 B.在编写复杂程序时,相对于高级语言而言代码量较大,且不易调试 C.可以直接访问寄存器、内存单元、以及I/O端口 D.随着高级语言的诞生,如今已完全被淘汰,不再使用 NOIP2011-18. 1956年( )授予肖克利、巴丁和布拉顿,以表彰他们对半导体的研究和晶体管效应的发现。 A.诺贝尔物理学奖 B.约翰·冯·诺依曼奖 C.图灵奖 D.高德纳奖 NOIP2011-20. 从ENIAC到当前最先进的计算机,冯·诺依曼体系结构始终占有重要地位。冯诺依曼体系结构的核心内容是( )。 A.采用开关电路 B.采用半导体器件 C.采用存储程序和程序控制原理 D.采用键盘输入

NOIP2008普及组复赛试题与解题报告

NOIP 2008普及组解题报告 一、ISBN号码(isbn.pas/c/cpp) 【问题描述】 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。 识别码的计算方法如下: 首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。 你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。 【输入】 输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。 【输出】 输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。 【输入输出样例1】 isbn.in 0-670-82162-4 isbn.out Right 【输入输出样例2】 isbn.in

noip2008普及组复赛试题(附题解)

全国信息学奥林匹克联赛(NOIP2008)复赛 普及组 注意事项: 1、文件名(程序名和输入输出文件名)必须使用小写。 2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。 3、全国统一评测时采用的机器配置为:CPU 1.9GHz,内存512M,上述时限以此配置为准。 各省在自测时可根据具体配置调整时限。

1.ISBN号码 (isbn.pas/c/cpp) 【问题描述】 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。 识别码的计算方法如下: 首位数字乘以1加上次位数字乘以2......以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2, (9) 再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。 你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。 【输入】 输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。 【输出】 输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。 2.排座椅 (seat.pas/c/cpp) 【问题描述】 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列

NOIP2012普及组复赛解题报告c++版本

信息学奥赛NOIP2012普及组解题报告(c++版本) 第一题质因数分解, 题目已知正整数n是两个不同的质数的乘积, 试求出较大的那个质数, 没什么技术含量, 直接开个根号搜一遍就好了. 另外不开根号会TLE导致得60分. 1 #include 2 #include 3int main() 4 { 5int n; 6scanf("%d", &n); 7for (int i = 2, k = sqrt(n) + 1; i < k; ++i) 8if (n % i == 0) 9{ 10printf("%d\n", n / i); 11break; 12} 13return0; 14 } 第二题寻宝 [题目]传说很遥远的藏宝楼顶层藏着诱人的宝藏。小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书。说明书的内容如下:藏宝楼共有N+1层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。除了顶层外,藏宝楼另有N层,每层M个房间,这M个房间围成一圈并按逆时针方向依次编号为0,…,M-1。其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。每个房间里有一个指示牌,指示牌上有一个数字x,表示从这个房间开始按逆时针方向选择第x个有楼梯的房间(假定该房间的编号为k),从该房间上楼,上楼后到达上一层的k号房间。比如当前房间的指示牌上写着2,则按逆时针方向开始尝试,找到第2个有楼梯的房间,从该房间上楼。如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。寻宝说明书的最后用红色大号字体写着:“寻宝须知:帮助你找到每层上楼房间的指示牌上的数字(即每层第一个进入的房间内指示牌上的数字)总和为打开宝箱的密钥”。请帮助小明算出这个打开宝箱的密钥。 这个题是个简单的模拟, 但是出乎意料的恶心, 当年做这个题的时候爆零, 钛蒻了, 总感觉这个比第三题难. 1 #include 2int x[10003][103], fjx[103]; 3bool k[10003][103]; 4int main()

全国信息学奥林匹克联赛(NOIP2011)复赛普及组

全国信息学奥林匹克联赛(NOIP2011)复赛普及组 全国信息学奥林匹克联赛(NOIP2011)复赛 普及组 (请选手务必仔细阅读本页内容) 一.题目概况 中文题目名称数字反转统计单词数瑞士轮表达式的值英文题目与子目录名reverse stat swiss exp 可执行文件名reverse stat swiss exp 输入文件名reverse.in stat.in swiss.in exp.in 输出文件名 reverse.out stat.out swiss.out exp.out 每个测试点时限1秒1秒1秒1秒 测试点数目10 10 10 10 每个测试点分值10 10 10 10 附加样例文件有有有有 结果比较方式全文比较(过滤行末空格及文末回车)题目类型传统传统传统传统 二.提交源程序文件名 对于 C++语言reverse.cpp stat.cpp swiss.cpp exp.cpp 对于 C语言reverse.c stat.c swiss.c exp.c 对于 pascal语言reverse.pas stat. pas swiss. pas exp.pas 三.编译命令(不包含任何优化开关) 对于 C++语言 g++ -o reverse reverse.cpp -lm g++ -o stat stat.cpp -lm g++ -o swiss swiss.cpp -lm g++ -o exp exp.cpp -lm

对于 C语言 gcc -o reverse reverse.c -lm gcc -o stat stat.c -lm gcc -o swiss swiss.c -lm gcc -o exp exp.c -lm 对于 pascal语言 fpc reverse.pas fpc stat.pas fpc swiss.pas fpc exp.pas 四.运行内存限制 内存上限 128M 128M 128M 128M 注意事项: 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3、全国统一评测时采用的机器配置为: CPU P4 3.0GHz,内存 1G,上述时限以此配置为准。 4、特别提醒:评测在 NOI Linux下进行。 第1 页共5 页 全国信息学奥林匹克联赛(NOIP2011)复赛普及组 1.数字反转 (reverse.cpp/c/pas) 【问题描述】 给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。 【输入】输入文件名为reverse.in。输入共1行,一个整数N。

相关文档
最新文档