当前位置:文档之家› NOIP2015提高组解题报告

NOIP2015提高组解题报告

NOIP2015提高组解题报告
NOIP2015提高组解题报告

NOIP2015提高组解题报告

T1 神奇的幻方

【题目大意】告诉你幻方的构造方法,给出N*N幻方的方案。N≤39且为奇数。【解题说明】直接模拟即可

【代码】

#include

int n,m,i,j,x,y,a[55][55];

int main(){

scanf("%d",&n);m=n*n;x=1;y=(n+1)/2;a[x][y]=1;

for(i=2;i<=m;a[x][y]=i++)

if(x==1&&y!=n)x=n,y++;else if(x!=1&&y==n)y=1,x--;

else if(x==1&&y==n)x++,a[x][y]=i;else if(!a[x-1][y+1])x--,y++;else x++;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++){

printf("%d",a[i][j]);

if(j

}

}

【时间复杂度】O(n^2) 【空间复杂度】O(n^2)

【思想难度】6 【编程难度】8 【总用时】5 min

T2 信息传递

【题目大意】在若干颗基环+内向树中找到一个最小的环。N≤200000,无自环。【解题说明】

30分做法:Floyd找最小环

60分做法:每个点BFS一遍就可以了

100分做法:

①基环+内向树的找环直接套模板即可

②Tarjan 找到一个最小的size不为1的强连通分量即可

③BFS/DFS 在暴力的基础上多加一个标记即可

④并查集据说这也能做

【代码】

#include

#include

#define N 222222

using namespace std;

int n,i,tm,tp,now,ans,sz,to[N],dfn[N],low[N],st[N];bool is[N];

void dfs(int x){

dfn[x]=low[x]=++tm;st[++tp]=x;is[x]=1;

int y=to[x];

if(!dfn[y])dfs(y),low[x]=min(low[x],low[y]);

else if(is[y])low[x]=min(low[x],dfn[y]);

if(low[x]==dfn[x]){

for(sz=now=0;now!=x;)now=st[tp--],sz++;

if(sz>1)ans=min(ans,sz);

}

}

int main(){

for(ans=1e9,scanf("%d",&n),i=1;i<=n;i++)scanf("%d",&to[i]);

for(i=1;i<=n;i++)if(!dfn[i])dfs(i);

printf("%d",ans);

}

【时间复杂度】O(n) 【空间复杂度】O(n)

【思想难度】25 【编程难度】25 【总用时】15 min

T3 斗地主

【题目大意】给你一副斗地主手牌,问你最快几次出完,数据随机,牌数不超过23。【解题说明】

30分做法:N≤4,没有顺子,直接贪心即可。

60~70分做法:

①写一个非常暴力的暴力。

②写一个非常暴力的状压DP。

90分做法:状压DP再小小地优化一下,由于每种牌在读入数据出来后上限已经固定了,最差情况下是每种牌平均分布,状态表示需要3^9*2^5=629856,转移再加一些优化,理论上能过,但CCF的机子太慢了会被卡10分

100分做法:

①还是暴力,单牌和对牌最后处理就可以了,剩下的各种情况讨论,随机数据轻松跑出。

②暴力+贪心,暴力枚顺子,剩下的牌肯定是可以贪心的,随便搞一搞就可以了

【代码】

#include

#include

#include

#define mxh 1000000007

using namespace std;

int ans,T,n,i,x,y,pai[6],cnt[15];

void find(int step){

int i,j,k,w;

if(step>=ans)return;

ans=min(ans,step+pai[1]+pai[2]+pai[3]+pai[4]);

if(pai[4])for(i=2;i<=14;i++)if(cnt[i]==4){

pai[4]--;cnt[i]-=4;

if(!pai[3]&&!pai[4]&&!pai[1]&&pai[2]<=1){

ans=min(ans,step+1);

pai[4]++;cnt[i]+=4;

return;

for(j=1;j<=14;j++)if(cnt[j]){

pai[cnt[j]]--;cnt[j]--;pai[cnt[j]]++;

for(k=j;k<=14;k++)if(cnt[k]){

pai[cnt[k]]--;cnt[k]--;pai[cnt[k]]++;

find(step+1);

pai[cnt[k]]--;cnt[k]++;pai[cnt[k]]++;

}

pai[cnt[j]]--;cnt[j]++;pai[cnt[j]]++;

}

if(pai[2]||pai[3]||pai[4])for(j=2;j<=14;j++)if(cnt[j]>1){

pai[cnt[j]]--;cnt[j]-=2;pai[cnt[j]]++;

for(k=j;k<=14;k++)if(cnt[k]>1){

pai[cnt[k]]--;cnt[k]-=2;pai[cnt[k]]++;

find(step+1);

pai[cnt[k]]--;cnt[k]+=2;pai[cnt[k]]++;

}

pai[cnt[j]]--;cnt[j]+=2;pai[cnt[j]]++;

}

pai[4]++;cnt[i]+=4;

}

if(pai[3])for(i=2;i<=14;i++)if(cnt[i]>=3){

pai[cnt[i]]--;cnt[i]-=3;pai[cnt[i]]++;

find(step+1);

for(j=1;j<=14;j++)if(cnt[j]){

pai[cnt[j]]--;cnt[j]--;pai[cnt[j]]++;

find(step+1);

pai[cnt[j]]--;cnt[j]++;pai[cnt[j]]++;

}

if(pai[2]||pai[3]||pai[4])for(j=2;j<=14;j++)if(cnt[j]>1){

pai[cnt[j]]--;cnt[j]-=2;pai[cnt[j]]++;

find(step+1);

pai[cnt[j]]--;cnt[j]+=2;pai[cnt[j]]++;

}

pai[cnt[i]]--;cnt[i]+=3;pai[cnt[i]]++;

}

if(pai[3]+pai[4]>=2)for(i=3;i<14;i++)if(cnt[i]>=3&&cnt[i+1]>=3){ pai[cnt[i]]--;cnt[i]-=3;pai[cnt[i]]++;w=i;

for(j=i+1;cnt[j]>=3&&j<=14;j++){

pai[cnt[j]]--;cnt[j]-=3;pai[cnt[j]]++;

find(step+1);w=j;

}

for(j=i;j<=w;j++){

pai[cnt[j]]--;cnt[j]+=3;pai[cnt[j]]++;

}

if(pai[2]+pai[3]+pai[4]>=3)for(i=3;i<13;i++)if(cnt[i]>=2&&cnt[i+1]>=2&&cnt[i+2]>=2){ pai[cnt[i]]--;cnt[i]-=2;pai[cnt[i]]++;

pai[cnt[i+1]]--;cnt[i+1]-=2;pai[cnt[i+1]]++;w=i+1;

for(j=i+2;cnt[j]>=2&&j<=14;j++){

pai[cnt[j]]--;cnt[j]-=2;pai[cnt[j]]++;

find(step+1);w=j;

}

for(j=i;j<=w;j++){

pai[cnt[j]]--;cnt[j]+=2;pai[cnt[j]]++;

}

}

if(pai[1]+pai[2]+pai[3]+pai[4]>=5)for(i=3;i<11;i++)if(cnt[i]&&cnt[i+1]&&cnt[i+2]&&cnt[i +3]&&cnt[i+4]){

pai[cnt[i]]--;cnt[i]--;pai[cnt[i]]++;

pai[cnt[i+1]]--;cnt[i+1]--;pai[cnt[i+1]]++;

pai[cnt[i+2]]--;cnt[i+2]--;pai[cnt[i+2]]++;

pai[cnt[i+3]]--;cnt[i+3]--;pai[cnt[i+3]]++;w=i+3;

for(j=i+4;cnt[j]&&j<=14;j++){

pai[cnt[j]]--;cnt[j]--;pai[cnt[j]]++;

find(step+1);w=j;

}

for(j=i;j<=w;j++){

pai[cnt[j]]--;cnt[j]++;pai[cnt[j]]++;

}

}

}

int main(){

for(scanf("%d%d",&T,&n);T--;){

ans=12;

memset(cnt,0,sizeof(cnt));

memset(pai,0,sizeof(pai));

for(i=1;i<=n;i++){

scanf("%d%d",&x,&y);

if(x==1)x=14;

if(x==0)x=1;

cnt[x]++;

}

for(i=1;i<=14;i++)pai[cnt[i]]++;

find(0);

printf("%d\n",ans);

}

}

【时间复杂度】O(?) 【空间复杂度】O(?)

【思想难度】27 【编程难度】51 【总用时】45 min

T4 跳石头

【题目大意】给你一排N块石头,你可以移走M块石头,使得最小的两块石头之间的距离尽可能长,N,M≤50000。

【解题说明】

20分做法:直接暴力即可

50分做法:考虑DP,f[i][j]表示在前i块石头移走j块石头的最短距离,转移即可

60分做法:考虑贪心,每次删除间距最小的,用堆维护

100分做法:考虑二分答案后贪心,先二分这个距离使其变为判断可行性问题,然后从前往后扫,一旦这个石头到上一个选的石头的距离小于这个二分的答案就把这块石头移走

这样显然是正确的,很容易证明先移一定比后移好,所以这个算法是正确的

【代码】

#include

int L,n,m,i,w,l,r,mid,pos,ans,a[55555];

bool ok(int x){

for(pos=w=0,i=1;i<=n;i++)if(a[i]-pos

return w<=m;

}

int main(){

for(scanf("%d%d%d",&L,&n,&m),i=1;i<=n;i++)scanf("%d",&a[i]);a[++n]=L;

for(l=1,r=L;l<=r;)if(ok(mid=l+r>>1))ans=mid,l=mid+1;else r=mid-1;

printf("%d",ans);

}

【时间复杂度】O(nlgL) 【空间复杂度】O(n)

【思想难度】30 【编程难度】23 【总用时】10 min

T5 子串

【题目大意】有两个字符串A和B。现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现的顺序依次连接起来得到一个新的字符串,问有多少种方案可以使得这个新串与字符串B相等?A的长度≤1000,B的长度≤200,k≤200。

【解题说明】

特殊的10分做法:k=1,所以直接扫一遍判断就可以了

特殊的20分做法:k=2,所以枚举分隔点再扫一遍判断就可以了

特殊的20分做法:k=m,所以从前往后扫一遍DP统计一下方案就可以了

70分做法:考虑dp,用f[i][j][k]表示A串匹配到第i个字符,B串匹配到第j个字符,已经取了k个互不重叠的非空子串的方案数,那么f[i][j][k]=Σf[i-w-o][j-w][k-1](w=1-A[i]和B[j]的最大后缀匹配,i-w-o>=0),f[0][0][0]=1,这样直接转移的复杂度是O(nm^3k)的,把o这一维前缀和转移一下,就是O(nm^2k)的,可以通过70分的数据。

90分做法:再把w也前缀和转移掉,就可以通过90分的数据。

100分做法:加一个滚动数组,然后再卡一卡常,就可以通过100分的数据。

【代码】(90)

#include

#define mxh 1000000007

int i,j,w,n,m,k,h,ans,pre[1111][222],f[2][1111][222];char a[1111],b[1111];

int main(){

scanf("%d%d%d%s%s",&n,&m,&k,a+1,b+1);

for(i=1;i<=n;i++)

for(j=1;j<=m;j++){

for(w=j;w&&i-(j-w)&&a[i-(j-w)]==b[w];w--);

pre[i][j]=j-w;

}

f[1][0][0]=1;

for(j=0;j<=n;j++)for(w=0;w<=m;w++)f[1][j][w]=(f[1][j][w]+(j?f[1][j-1][w]:0))%mxh;

for(j=0;j<=n;j++)for(w=0;w<=m;w++)f[1][j][w]=(f[1][j][w]+((j&&w)?f[1][j-1][w-1]:0))%m xh;

for(i=1;i<=k;h^=1,i++){

for(j=0;j<=n;j++)for(w=0;w<=m;w++)

f[h][j][w]=(((j&&w)?f[h^1][j-1][w-1]:0)-(((j-pre[j][w])&&(w-pre[j][w]))?f[h^1][j-pre[j][w]-1][w-pre[j][w]-1]:0)+mxh)%mxh;

if(i!=k){

for(j=1;j<=n;j++)for(w=1;w<=m;w++)

f[h][j][w]=(f[h][j][w]+f[h][j-1][w])%mxh;

for(j=1;j<=n;j++)for(w=1;w<=m;w++)

f[h][j][w]=(f[h][j][w]+f[h][j-1][w-1])%mxh;

}

}

for(i=1;i<=n;i++)ans=(ans+f[h^1][i][m])%mxh;

printf("%d",ans);

}

【时间复杂度】O(nmk) 【空间复杂度】O(nm)

【思想难度】39 【编程难度】30 【总用时】45 min

T6 运输计划

【题目大意】给你一颗带权树和若干条航线,你可以使一条边的权值变为0,然后使得最长航线最短,N≤300000。

【解题说明】

①20分做法:m=1,直接找到这条路然后删掉这条路上的最长边就可以了

②50~60分做法:枚举删除哪条边,然后用倍增的方法暴力求出每条航线的代价就可以了,复杂度O(nlgn+nmlgn)

③特殊的40分做法:为一条链,可以线段树随便维护一下,结合算法②可以获得80分。

④45~60分做法:考虑把初始航线长度从小到大排序,二分这个答案,然后用数据结构判

断一下可行性就可以了,简单的方法是树链剖分,这样的时间复杂度是O(mlg^3n)的,理论上可以通过95分的数据,但由于CCF的评测机很慢,只能通过45~60分的数据。

⑤95分做法:把航线从大到小排序,我们要求的就是当前航线的交中的最大值,这个可以

用树链剖分维护然后分类讨论一下是选择新的交的最大值好还是旧的交的最大值和新航线的长度好,如果新航线单独算一条更好,那么就退出并得到了答案,时间复杂度O(nlgn+mlg^2n)。

⑥95分做法:同样把航线从大到小排序,仍然要求交,可以用LCA大力分类讨论一下得

到航线的交,这样时间复杂度是O(nlgn+mlgn)的,但由于常数比较大,还是不能通过全部的数据。

⑦100分做法:据说可以用直接线段树维护,由于线段树很快,就可以艹过全部数据啦。【代码】(95)

#include

#include

#include

#define N 300300

using namespace std;

int

n,m,i,j,x,y,z,tp,pt,ww,tot,sum,ans,bl[N],sz[N],h[N],pos[N],to[N],fa[N][19],g[N][19],fir[N],va[N<< 1],ne[N<<1],la[N<<1],val[N<<2];bool lz[N<<2];

struct P{int x,y,z;}p[N];struct Q{int l,r;}q[N];char ch;

void read(int &x){

for(ch=getchar();ch<'0'||ch>'9';ch=getchar());

for(x=0;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';

}

bool cmp(P a,P b){return a.z>b.z;}bool cmp2(Q a,Q b){return a.l

void ins(int x,int y,int z){la[++tot]=y;ne[tot]=fir[x];va[tot]=z;fir[x]=tot;}

void dfs(int x){

sz[x]=1;

for(int i=1;i<=18;i++)fa[x][i]=fa[fa[x][i-1]][i-1],g[x][i]=g[x][i-1]+g[fa[x][i-1]][i-1];

for(int i=fir[x];i;i=ne[i])if(fa[x][0]!=la[i]){

fa[la[i]][0]=x;g[la[i]][0]=va[i];h[la[i]]=h[x]+1;

dfs(la[i]);

sz[x]+=sz[la[i]];

}

}

void dfs2(int x,int f){

pos[x]=++tp;to[tp]=x;bl[x]=f;

int i,now=0;

for(i=fir[x];i;i=ne[i])if(fa[x][0]!=la[i]&&sz[la[i]]>sz[now])now=la[i];

if(!now)return;

dfs2(now,f);

for(i=fir[x];i;i=ne[i])if(fa[x][0]!=la[i]&&now!=la[i])dfs2(la[i],la[i]);

}

int lca(int x,int y){

sum=0;

if(h[x]

for(i=0;i<=18;i++)if(t&(1<

for(i=18;i>=0;i--)if(fa[x][i]!=fa[y][i])sum+=g[x][i]+g[y][i],x=fa[x][i],y=fa[y][i];

if(x==y)return sum;else{

sum+=g[x][0]+g[y][0];

return sum;

}

}

void bt(int k,int l,int r){

if(l==r){val[k]=g[to[l]][0];return;}

int mid=l+r>>1;

bt(k<<1,l,mid);bt(k<<1|1,mid+1,r);

val[k]=max(val[k<<1],val[k<<1|1]);

}

void add(int k,int l,int r,int x,int y){

if(x>y||x==0)return;

if(x<=l&&r<=y){

val[k]=0;lz[k]=1;

return;

}

if(lz[k]){val[k<<1]=val[k<<1|1]=0;lz[k<<1]=lz[k<<1|1]=1;}

int mid=l+r>>1;

if(x<=mid)add(k<<1,l,mid,x,y);

if(y>mid)add(k<<1|1,mid+1,r,x,y);

val[k]=max(val[k<<1],val[k<<1|1]);

}

int main(){

for(read(n),read(m),i=1;i

dfs(1);dfs2(1,1);

for(i=1;i<=m;i++)read(p[i].x),read(p[i].y),p[i].z=lca(p[i].x,p[i].y);

bt(1,1,n);sort(p+1,p+m+1,cmp);

for(i=1;i<=m;i++)if(p[i].z>ans){

ww=val[1];pt=0;x=p[i].x;y=p[i].y;

for(;bl[x]!=bl[y];x=fa[bl[x]][0]){

if(h[bl[x]]

q[++pt].l=pos[bl[x]];q[pt].r=pos[x];

}

if(pos[x]>pos[y])swap(x,y);

if(pos[x]!=pos[y])q[++pt].l=pos[x]+1,q[pt].r=pos[y];

sort(q+1,q+pt+1,cmp2);

for(j=1;j<=pt;j++)add(1,1,n,q[j-1].r+1,q[j].l-1);

add(1,1,n,q[pt].r+1,n);

if(max(p[1].z-ww,p[i].z)<=p[1].z-val[1]){

ans=max(ans,max(p[1].z-ww,p[i].z));

break;

}else ans=max(ans,p[1].z-val[1]);

}

printf("%d",ans);

}【时间复杂度】O(nlgn+mlgn) 【空间复杂度】O(n) 【思想难度】35 【编程难度】52 【总用时】75 min ——By lbn187

棋盘解题报告(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

NOIP2015提高组复赛试题Day2

全国信息学奥林匹克联赛(2015)复赛 提高组 2 (请选手务必仔细阅读本页内容) 一.题目概况 二.提交源程序文件名 三.编译命令(不包含任何优化开关) 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、中函数 ()的返回值类型必须是,程序正常结束时的返回值必须是 0。 3、全国统一评测时采用的机器配置为: () x2 240 ,2.8,内存 4G,上述时限以此配置为准。 4、只提供格式附加样例文件。 5、特别提醒:评测在当前最新公布的下进行,各语言的编译

器版本以其为准。

1.跳石头 () 【问题描述】 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石)。 【输入格式】 输入文件名为。 输入文件第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。 接下来 N 行,每行一个整数,第 i 行的整数(0 < < L)表示第 i 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。 【输出格式】 输出文件名为。 输出文件只包含一个整数,即最短跳跃距离的最大值。 【输入输出样例 1】 【输入输出样例 1 说明】 将与起点距离为 2 和 14 的两个岩石移走后,最短的跳跃 距离为 4(从与起点距离 17 的岩石跳到距离 21 的岩石,或者

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){

NOIP2015提高组

CCF全国信息学奥林匹克联赛(NOIP2015)复赛 提高组 day1 (请选手务必仔细阅读本页内容) 注意事项: 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。 3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) II x2 240 processor,2.8GHz, 内存4G,上述时限以此配置为准。 4、只提供Linux格式附加样例文件。 5、特别提醒:评测在当前最新公布的NOI Linux下进行,各语言的编译器版本以其为准。

1.神奇的幻方 (magic.cpp/c/pas) 【问题描述】 幻方是一种很神奇的 N?N 矩阵:它由数字 1,2,3,……,N?N 构成,且每行、每列及两条对角线上的数字之和都相同。 当 N 为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1 写在第一行的中间。 之后,按如下方式从小到大依次填写每个数 K(K=2,3,…,N?N) : 1.若(K?1)在第一行但不在最后一列,则将 K 填在最后一行,(K?1)所在列 的右一列; 2.若(K?1)在最后一列但不在第一行,则将 K 填在第一列,(K?1)所在行的上 一行; 3.若(K?1)在第一行最后一列,则将 K 填在(K?1)的正下方; 4.若(K?1)既不在第一行,也不在最后一列,如果(K?1)的右上方还未填数, 则将K填在(K?1)的右上方,否则将 K 填在(K?1)的正下方。 现给定 N,请按上述方法构造 N?N 的幻方。 【输入格式】 输入文件名为magic.in。 输入文件只有一行,包含一个整数 N,即幻方的大小。 【输出格式】 输出文件名为magic.out。 输出文件包含 N行,每行 N个整数,即按上述方法构造出的 N?N 的幻方。相邻两个整数之间用单个空格隔开。 magic/magic1.in magic/magic1.ans 【输入输出样例2】 见选手目录下的magic/magic2.in和magic/magic2.ans。 【数据规模与约定】 对于 100% 的数据,1≤N≤39 且 N 为奇数。

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)

NOIP2013提高组复赛Day2

CCF全国信息学奥林匹克联赛(NOIP2013)复赛 提高组 day2 (请选手务必仔细阅读本页内容) 注意事项: 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。 3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) 64x2 Dual Core CPU 5200+, 2.71GHz,内存2G,上述时限以此配置为准。 4、只提供Linux格式附加样例文件。 5、特别提醒:评测在NOI Linux下进行。

1.积木大赛 (block.cpp/c/pas) 【题目描述】 春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是?i。 在搭建开始之前,没有任何积木(可以看成n块高度为0的积木)。接下来每次操作,小朋友们可以选择一段连续区间[L,R],然后将第L块到第R块之间(含第L块和第R块)所有积木的高度分别增加1。 小M是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。 【输入】 输入文件为block.in 输入包含两行,第一行包含一个整数n,表示大厦的宽度。 第二行包含n个整数,第i个整数为?i。 【输出】 输出文件为block.out 仅一行,即建造所需的最少操作数。 【样例解释】 其中一种可行的最佳方案,依次选择 [1,5] [1,3] [2,3] [3,3] [5,5] 【数据范围】 对于30%的数据,有1≤n≤10; 对于70%的数据,有1≤n≤1000; 对于100%的数据,有1≤n≤100000,0≤?i≤10000。

NOIP2015初赛普及组C++试题及参考答案

第二十一届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题 竞赛时间:2015年10月11日14:30-16:30 一、单项选择题(共20题,每题1.5分,共计30分;每题有且仅有一个正确选项) ⒈1MB等于( )。 A.10000字节 B.1024字节 C.1000×1000字节 D.1024×1024字节 ⒉在PC机中,PENTIUM(奔腾)、酷睿、赛扬等是指( )。A.生 产厂家名称 B.硬盘的型号 C.CPU的型号 D.显示器的型号 ⒊操作系统的作用是( )。 A.把源程序译成目标程序 B.便于进行数据管理 C.控制和管理系统资源 D.实现硬件之间的连接 ⒋在计算机内部用来传送、存贮、加工处理的数据或指令都是以( )形式进行的。 A.二进制码 B.八进制码 C.十进制码 D.智能拼音码 ⒌下列说法正确的是( )。 A.CPU的主要任务是执行数据运算和程序控制 B.存储器具有记忆能力,其 中信息任何时候都不会丢失C.两个显示器屏幕尺寸相同,则它们的分辨率 必定相同D.个人用户只能使用Wifi的方式连接到Internet ⒍二进制数00100100和00010100的和是( )。 A.00101000 B.01100111 C.01000100 D.00111000 ⒎与二进制小数0.1相等的十六进制数是( )。 A.0.8 B.0.4 C.0.2 D.0.1 ⒏所谓的“中断”是指( )。A.操 作系统随意停止一个程序的运行 B.当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的过程 C.因停机而停止一个程序的运行 D.电脑死机 ⒐计算机病毒是( )。A.通过计算机传播的 危害人体健康的一种病毒 B.人为制造的能够侵入计算机系统并给计算机带来故障的程序或指令集合 C.一种由于计算机元器件老化而产生的对生态环境有害的物质 D.利用计算 机的海量高速运算能力而研制出来的用于疾病预防的新型病毒 ⒑FTP可以用于( )。 A.远程传输文件 B.发送电子邮件 C.浏览网页 D.网上聊天 ⒒下面哪种软件不属于即时通信软件( )。 A.QQ B.MSN C.微信 D.P2P

noip2015初赛普及组答案分析

单项选择题 1.A。计算机内部的用来传送、存贮、加工处理的数据或指令都是以二进制形式进行的。 2.A。写这题我用的是排除法,B选项显然不对,内存在断电后数据会丢失,C选项也是,屏幕的分辨率是可以手动调整的,D选项,当年我们都用宽带连接Internet的。 3.A。二进制小数转化为十六进制小数时,每四位二进制数转化为以为 十六进制数,故0.10002可以转化为0.816。 4.D。我的做法是将每个数都化为二进制形式,因为十六进制数和八进 制数转化为二进制数很容易,最后求得答案是D。 5.D。在链表中,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域,结点与结点之间是用指针 连接的,故地址不必连续。 6.B。模拟一下进栈出栈的过程就行了,共有6次操作:进栈,进栈,出栈,进栈,进栈,出栈,每次操作后栈内元素分别为”a”,”a b”,”a”,”a b c”,”a b c d”,”a b c”,故最后栈顶元素是c。 7.B。前序遍历的顺序是”根->左->右”,后序遍历的顺序是”左->右->根”,对照四个答案,只有B能满足题目要求。 8.B。我们知道树高为n的满二叉树的结点个数为2n?1,当树高为5 时结点个数为31,当树高为6时结点个数为63,故答案是B。 9.B。画一张图的事情,就不说了。 10.D。由递推公式可得T(n)=1+(1+2+…+n)=n2+n2+1,故算法时间 的复杂度为O(n2)。 11.D。用vector存边,由一个顶点的边引到另一个顶点,再不断引出别的顶点,过程中每个顶点和每条边都只用到一遍,故复杂度为O(n+e)。12.A。哈夫曼算法用来求哈夫曼树,此树的特点就是引出的路程最短, 求的过程运用到贪心思想,具体的请参考一下别的文章。 13.D。llink和rlink分别指向前驱和后继,不妨设p的前驱为o,在未插入前 p->llink就是o,o->rlink就是p,插入时,先将o->rlink赋为q,再将 q->rlink赋为p,然后将q->llink赋为o,最后将p->llink赋为q。 14.A。最粗暴的方法就是直接模拟,不知道有没有更先进的算法。 15.A。- -丨这题猜猜都是A,哪有考生自带鼠标的。

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

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”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。注:本题中为了书写方便,在描述复杂度时,使用大

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

NOIP2007_提高组_复赛试题

全国信息学奥林匹克联赛(NOIP2007)复赛提高组 1.统计数字 (count.pas/c/cpp) 【问题描述】 某次科研调查时得到了n 个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数 不超过10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。【输入】 输入文件count.in包含n+1 行:第1 行是整数 n,表示自然数的个数。 第2~n+1 行每行一个自然数。 【输出】输出文件count.out包含m 行(m 为n 个自然数中不相同数的个数),按照自然数从小到大 的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。 【输入输出样例】 【限制】 40%的数据满足:1<=n<=1000 80%的数据满足:1<=n<=50000 100%的数据满足:1<=n<=200000,每个数均不超过1 500 000 000(1.5*109)

2.字符串的展开 (expand.pas/c/cpp) 【问题描述】 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下:(1)遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧 同为小写字母或同为数字,且按照ASCII 码的顺序,减号右边的字符严格大于左边的字符。 (2)参数p1:展开方式。p1=1 时,对于字母子串,填充小写字母;p1=2 时,对于字母子串, 填充大写字母。这两种情况下数字子串的填充方式相同。p1=3 时,不论是字母子串还是数字子串, 都用与要填充的字母个数相同的星号“*”来填充。 (3)参数p2:填充字符的重复个数。p2=k 表示同一个字符要连续填充k 个。例如,当p2=3 时,子串“d-h”应扩展为“deeefffgggh”。减号两侧的字符不变。 (4)参数p3:是否改为逆序:p3=1 表示维持原有顺序,p3=2 表示采用逆序输出,注意这时仍然不包括减号两端的字符。例如当p1=1、p2=2、p3=2 时,子串“d-h”应扩展为“dggffeeh”。 (5)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII 码的顺序小于或等于左边字符, 输出时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。 【输入】 输入文件expand.in包括两行: 第1 行为用空格隔开的3 个正整数,依次表示参数p1,p2,p3。 第2 行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。 【输出】 输出文件expand.out只有一行,为展开后的字符串。

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;

noip2015普及组初赛试题+答案

NOIP2015第二十一届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题 竞赛时间:2015年10月11日14:30~16:30 选手注意: 1、试题纸共有5 页,答题纸共有2 页,满分100 分。请在答题纸上作答,写在试题纸上的一律无效。 2、不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。 一、单项选择题(共20题,每题1.5分,共计30分;每题有且仅有一个正确选项) 1. 1MB 等于()。 A. 1000 字节 B. 1024 字节 C.1000 X 1000 字节 D. 1024 X 1024 字节 2. 在P C 机中,PENTIUM (奔腾)、酷睿、赛扬等是指()。 A.生产厂家名称 B.硬盘的型号 C. CPU 的型号 D.显示器的型号 3. 操作系统的作用是()。 A.把源程序译成目标程序 B.便于进行数据管理 C. 控制和管理系统资源 D.实现硬件之间的连接 4. 在计算机内部用来传送、存贮、加工处理的数据或指令都是以()形式进行的。 A. 二进制码 B.八进制码 C.十进制码 D.智能拼音码 5. 下列说法正确的是()。 A. CPU 的主要任务是执行数据运算和程序控制 B. 存储器具有记忆能力,其中信息任何时候都不会丢失 C. 两个显示器屏幕尺寸相同,则它们的分辨率必定相同 D. 个人用户只能使用W ifi 的方式连接到I nternet 6. 二进制数00100100 和00010100 的和是()。 A. 00101000 B. 01000001 C. 01000100 D. 00111000 7. 与二进制小数0.1 相等的十六进制数是() A. 0.8 B. 0.4 C. 0.2 D. 0.1 8. 所谓的“中断”是指()。 A. 操作系统随意停止一个程序的运行 B. 当出现需要时,CPU 暂时停止当前程序的执行转而执行处理新情况的过程 C. 因停机而停止一个程序的运行 D. 电脑死机 9. 计算机病毐是()。 A. 通过计算机传播的危害人体健康的一种病毒 B. 人为制造的能够侵入计算机系统并给计算机带来故障的程序或指令集合 C. 一种由于计算机元器件老化而产生的对生态环境有害的物质 D. 利用计算机的海量高速运算能力而研制出来的用于疾病预防的新型病毒 10. FTP 可以用于()。 A.远程传输文件 B.发送电子邮件 C.浏览网页 D.网上聊天 11. 下面哪种软件不属于即时通信软件()。 A. QQ B. MSN C.微信 D. P2P 12. 6 个顶点的连通图的最小生成树,其边数为()。 A. 6 B. 5 C. 7 D. 4 13. 链表不具备的特点是()。 A.可随机访问任何一个元素 B.插入、删除操作不需要移动元素 C. 无需事先估计存储空间大小 D. 所需存储空间与存储元素个数成正比 14. 线性表若采用链表存储结构,要求内存中可用存储单元地址() A.必须连续 B.部分地址必须连续 C. 一定不连续 D.连续不连续均可 15. 今有一空栈S,对下列待进栈的数据元素序列a,b,c,d,e,f 依次进行进栈,进栈,出栈,进栈,进栈, 。 出栈的操作,则此操作完成后,栈S的栈顶元素为() A. f B. c C. a D. b 16. 前序遍历序列与中序遍历序列相同的二叉树为()。 A. 根结点无左子树的二叉树 B. 根结点无右子树的二叉树 C. 只有根结点的二叉树或非叶子结点只有左子树的二叉树

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个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。 【数据说明】

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

noip2019第十年全国青少年信息学奥林匹克联赛普及组复赛试题

noip2019第十年全国青少年信息学奥林匹克联赛普及组复赛试 题 〔普及组三小时完成〕 【一】不高兴的津津 【问题描述】 津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。 【输入文件】 输入文件unhappy.in包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。【输出文件】 输出文件unhappy.out包括一行,这一行只包含一个数字。如果不会不高兴那么输出0,如果会那么输出最不高兴的是周几〔用1,2,3,4,5,6,7分别表示周一,周二,周三,周四,周五,周六,周日〕。如果有两天或两天以上不高兴的程度相当,那么输出时间最靠前的一天。【样例输入】 53 62 72 53 54 04 06 【样例输出】 3 【二】花生采摘(peanuts.pas/dpr/c/cpp) 【问题描述】 鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。 鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格〔如图1〕。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。” 我们假定多多在每个单位时间内,可以做以下四件事情中的一件: 1)从路边跳到最靠近路边〔即第一行〕的某棵花生植株; 2)从一棵植株跳到前后左右与之相邻的另一棵植株; 3)采摘一棵植株下的花生; 4)从最靠近路边〔即第一行〕的某棵花生植株跳回路边。 现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少

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列

相关主题
文本预览
相关文档 最新文档