CSP-S模拟试题及参考答案

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 85 浏览




1.以下关于CSP-J/S的描述错误的是() 分值2

A.任何人都可以自愿报名参加CSP-J/S

B.CSP-J/SCCF独立主办的认证,和任何其他机构主办的等级考试无关

C.CSP-J/SNOIP有密切关系

D.CSP-J/S认证成绩优异者,可参加NOI省级选拔,省级选拔成绩优异者可参加NOIC

2.-128的补码表示为()分值2

A.00000000

B.00000001

C.10000000

D.11111111

3.以下不属于TCP拥塞控制算法的是()  分值2

A.慢启动

B.拥塞避免

C.快启动

D.快速重传

4.以下不是基于UDP协议的是()  分值2

A.DNS

B.RIP

C.TELNET

D.TFTP

5.定义如下函数add_edge和全局变量:

int to[MAX],nxt[MAX],h[MAX],top;

void add_edge(int u,int v){

to[++top]=v,nxt[top]=h[u],h[u]=top;

}

如下图节点编号从1开始,按边的编号顺序,以前向星的方式存储,请问nxt[h[3]]的值为()图片

分值2

A.6

B.3

C.8

D.7

6.如下图所示,从节点16步走到节点5的方案数有多少种()

图片

A.5

B.8

C.7

D.6

7.同时查找 2n 个数中的最大值和最小值,最少比较次数为( )。 分值2

A.3(n-2)/2

B.3n-2

C.4n-2

D.2n-2

8. A  B 是两个长为 n 的有序数组,现在需要将 A  B 合并成一个排好序的 数组,请问任何以元素比较作为基本运算的归并算法最坏情况下至少要做 ( )次比较。  分值2

A.n2

B.nlog2n

C.2n

D.2n-1

9.G 是一个非连通简单无向图,共有 36 条边,则该图至少有( )个顶点  分值2

A.10

B.9

C.8

D.7

10.由四个不同的点构成的简单无向连通图的个数是( )  分值2

A.32

B.35

C.38

D.31

11.前缀表达式- + * 4 + 2 3 1 5的值为()  分值2

A.16

B.17

C.19

D.15

12.2+3*(4-(5+6))/7的逆波兰表达式为() 分值2

A.2 3 4 5 6 - + * 7 / +

B.2 3 4 5 6 - + * / 7 +

C.2 3 4 5 6 + - * 7 / +

D.2 3 4 5 6 + + * / 7 -

13.若某算法的计算时间表示为递推关系:图片则该算法的复杂度为()  分值2

A.O(n)

B.O(nlog2n)

C.O(nlog22n)

D.O(nlong23n)

14.若某算法的计算时间表示为递推关系:T(n)=3T(n/4)+nlong2n则该算法的复杂度为()  分值2

A.O(n)

B.O(nlog2n)

C.O(nlog22n)

D.O(nlong23n)


15. 现有变量a,b,c,d,取值范围均为[0,15],假设每个值出现的概率相同,则表达式的值能被3整除的概率( )(为计算机中的异或运算符,结果用分数形式表达)  分值2

A3/8

B.1/2

C.1/4

D.1/8

二、阅读程序写结果(4题,每题10分,共计40)

1.#include

using namespace std;

int a,b,c;

int* cal(int *p,int &q,int r) {

      q+=r;

      *p+=q;

      return p;

}


int main() {

      cin>>a>>b>>c;

      c=*cal(&a,b,c);

      cout<<a<<" span=""></a<<">

}

1.1 cal函数中参数p使用指针传递,qr则是值传递  分值2.5

1.2 cal函数返回一个指向int类型存储空间的地址  分值2.5

1.3 当输入1 2 3时,程序输出结果为()  分值2.5

A.6 2 3

B.6 5 3

C.6 5 6

D.1 2 6

1.4 当输入23 45 11时,程序的输出结果为()  分值2.5

A.79 56 11

B.79 56 79

C.44 56 79

D.79 56 44

2.#include

#include

#define MAX 1000

#define p sqrt(3)

using namespace std;

int n,dp[1000][3];

int h0=1,h1=3;

double ans1=(2+p)/(2*p),ans2=(-2+p)/(2*p);

int main() {

      cin>>n;

      dp[1][0]=dp[1][1]=dp[1][2]=1;

      for(int i=2,tmp; i<=n; i++) {

            dp[i][0]=dp[i-1][1]+dp[i-1][2];

            dp[i][1]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2];

            dp[i][2]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2];

            tmp=h1;

            h1=2*(h1+h0);

            h0=tmp;

      }

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

            ans1=ans1*(1+p);

            ans2=ans2*(1-p);

      }

      cout<<h1<<endl;< span=""></h1<<endl;<>

      cout<<dp[n][0]+dp[n][1]+dp[n][2]<<endl;< span=""></dp[n][0]+dp[n][1]+dp[n][2]<<endl;<>

      cout<<ans1+ans2<<endl;< span=""></ans1+ans2<<endl;<>

}

2.1 上述程序的输出中h1dp[n][0]+dp[n][1]+dp[n][2]的值相等  分值2.5

2.2 上述程序的输出中dp[n][0]+dp[n][1]+dp[n][2]ans1+ans2的值相等  分值2.5

2.3 n等于5时,第一行输出(h1)结果为( )  分值2.5

A.164

B.60

C.448

D.128

n等于10时,第三行输出(ans1+ans2)结果为()  分值2.5

A.9136

B.68192

C.24960

D.3344

3.#include

#include

#define LL long long

using namespace std;

LL l,r;

LL f[12][10][10][2][2][2],a[20];

LL Dfs(LL now,LL p,LL pp,LL _4,LL _8,LL top,LL hw) {

      if(_4&&_8) return 0;

      if(!now) return hw;

      if(!top && f[now][p][pp][_4][_8][hw]!=-1) return f[now][p][pp][_4][_8][hw];

      LL Up=top?a[now]:9;

      LL ret(0);

      for(LL i=0; i<=Up; ++i)

            ret+=Dfs(now-1,i,p, _4|(i==4),_8|(i==8), top&&(i==Up) ,hw|(i==pp&&i==p));

      if(!top) f[now][p][pp][_4][_8][hw]=ret;

      return ret;

}

inline LL Solve(LL x) {

      LL tot(0);

      while(x) {

            a[++tot]=x;

            x/=10;

      }

      if(tot!=11) return 0;

      LL ret(0);

      for(LL i=1; i<=a[tot]; ++i)

            ret+=Dfs(tot-1,i,0,(i==4),(i==8),i==a[tot],0);

      return ret;

}

int main() {

      cin>>l>>r;

      memset(f,-1,sizeof(f));

      cout<<solve(r)-solve(l-1);< span=""></solve(r)-solve(l-1);<>

      return 0;

}

3.1 同时包含48的数字都不会被统计  分值2.5

3.2 相邻数位中,超过3个数位相同的数字都不会被统计  分值2.5

3.3 下列哪个是合法(会被统计)的数字()  分值2.5

A.2323234823

B.1015400080

C.23333333333

D.10010012022

3.4当输入12121284000 12121285550时,程序输出结果为()  分值2.5

A.5

B.457

C.455

D.6

4.

图片 图片

4.1 上述程序实现大整数加法 分值2.5

4.2 上述程序的算法复杂度大于(其中nmax(s1.length(),s2.length()))  分值2.5

4.3 当输入111 011时程序输出为()  分值2.5

A.10

B.4

C.21

D.2

4.4 当输入10101 101010时程序输出为()  分值2.5

A.441

B.882

C.1764

D.220

五、完善程序(每题15分,共计30)

1.(链表反转)单向链表反转是一道经典算法问题,比如有一个链表是这样的,1->2->3->4->5,反转后成为 5->4->3->2->1。现给定如下链表节点的定义:

struct LinkNode{

int value;

LinkNode* next;};


非递归实现:

LinkNode* Reverse(LinkNode* header) {

      if (header == NULL || header->next == NULL) {

            return header;

      }


      LinkNode* pre = header, *cur = header->next;

      pre->next = NULL;

      while(cur != NULL) {

            LinkNode* next = ____1____;

            ___2____ = pre;

            pre = cur;

            cur = next;

      }

      return pre;

}

递归实现:

LinkNode * Reverse(LinkNode * head) {

      if (head == NULL || head->next == NULL) {

            return head;

      }

      LinkNode * newhead = ___3____;

      ___4_____ = head;

      head->next = ___5____;

      return newhead;

}

1.1上述程序___1___中应该填写()

 分值3

A.pre-> next

B.cur-> next

C.header-> next

D.NULL

1.2上述程序___2___中应该填写()  分值3

A.pre-> next

B.cur-> next

C.header-> next

D.NULL

1.3上述程序___3___中应该填写()  分值3

A.ReverseList(head)

B.ReverseList(pre)

C.ReverseList(cur)

D.ReverseList(head->next)

1.4上述程序___4___中应该填写()  分值3

A.pre-> next->next

B.cur-> next->next

C.header-> next->next

D.NULL

1.5上述程序___5___中应该填写()  分值3

A.pre-> next

B.cur-> next

C.header-> next

D.NULL


2) (最小环问题)给定一张无向图,求图中一个至少包含 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小。该问题称为无向图的最小环问题。在本题中,你需要输出最小环的方案,若最小环不唯一,输出任意一个均可。若无解,输出 No

1.1上述程序___1___中应该填写()  分值3

A.j

B.pos[i][j]

C.i

D.pos[j][i]

1.2上述程序___2___中应该填写()  分值3

A.j

B.pos[i][j]

C.i

D.pos[j][i]

1.3上述程序___3___中应该填写()  分值3

A.D[i][j]+G[k][j]+G[i][k]

B.D[i][j]+G[j][k]+G[k][i]

C.D[i][k]+G[k][j]+G[i][j]

D.D[i][j]+G[j][i]+G[i][k]

1.4上述程序___4___中应该填写()  分值3

A.D[k][j]>D[i][k]+D[k][j]

B.D[i][j]>D[i][k]+D[k][j]

C.D[i][j]<d[i][k]+d[k][j]< span=""></d[i][k]+d[k][j]<>

D.D[i][k]>D[i][k]+D[k][j]

1.5上述程序___5___中应该填写()  分值3

A.pos[i][i]

B.stk[i]

C.pos[1][i]

D.pos[i][1]

 图片

参考答案

1C 2C 3C 4C 5B 6B 7B 8D 9A 10C

11A 12C 13D 14B 15A


阅读1错对CB

对对AC

3对错CA

4错错CB

完善程序

1B 2B 3D 4C 5D

1B2A3B4B5B



发布于 2024-04-01 10:21

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

广告
All Rights Reserved Powered BY WeCenter V4.1.0 © 2025 京ICP备20005761号-2