不是VIP会员,不能显示答案,请在后台“我的信息” 在线升级 VIP

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

1. 下列C++表达式,值最大的是( ) 。

  • A.'Z'-'A'
  • B.52%53>>1
  • C.(rand()-rand()+1)%26
  • D.20+15%28/3

2. 下列属于解释执行的程序设计语言是( )。

  • A.C
  • B.C++
  • C.Pascal
  • D.Python

3. 对于64KB的存储器,其最大地址码用十六进制表示是( )。

  • A.10000
  • B.FFFF
  • C.1FFFF
  • D.EFFFF

4. 为解决Web应用中的不兼容问题,保障信息的顺利流通,( )制定了一系列标准,涉及HTML,XML,CSS等,并建议开发者遵循。

  • A.微软
  • B.美国计算机协会(ACM)
  • C.联合国教科文组织
  • D.万维网联盟(W3C)

5. 若一个整数是另一个整数的平方,则称该数是“完全平方数”,如4、9、25等。下列表达式无法判断该整数是否为完全平方数的是()。

  • A.floor(sqrt(x)+0.5)==sqrt(x)
  • B.int(sqrt(x))== sqrt(x)
  • C.x / int( sqrt(x))==int(x/int(sqrt(x)))
  • D.int(sqrt(x))*int(sqrt(x))==x

6. 将8个名额分给5个不同的班级,允许有的班级没有名额,有几种不同的分配方案()。

  • A.60
  • B.120
  • C.495
  • D.792

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

  • A.3(n-2)/2
  • B.4n-2
  • C.3n-2
  • D.2n-2

8. 具有n个顶点,e条边的图采用邻接表存储结构,进行深度优先遍历和广度优先遍历运算的时间复杂度均为()。

  • A.O(n^2)
  • B.O(e^2)
  • C.O(ne)
  • D.O(n+e)

9. 两根粗细相同、材料相同的蜡烛,长度比是21∶16,它们同时开始燃烧,18分钟后,长蜡烛与短蜡烛的长度比是15:11,则较长的那根蜡烛还能燃烧( )。

  • A.150分钟
  • B.225分钟
  • C.128分钟
  • D.9分钟

10. 一次数学考试试题由两部分组成,结果全班有15人得满分,第一部分做对的有31人,第二部分做错的有19人,那么两部分都做错的有( )。

  • A.3
  • B.4
  • C.6
  • D.12

11. 设一组初始记录关键字序列为(50,40,95,20,15,70,60,45),则以初始增量值d=4进行希尔排序,第二趟结束后前4条记录关键字为( )。

  • A.15,20.50,40
  • B.15,40,60,20
  • C.15,20,40,45
  • D.15,20,40,50

12. 给出以下邻接矩阵,其表示的图是DAG(有向无环图)的是( )。

  • A.
  • B.
  • C.
  • D.

13. 下列关于最短路算法的说法正确的是( )。

  • A.当图中不存在负权回路但是存在负权边时, Dijkstra 算法可以求出源点到所有点的最短路
  • B.当图中不存在负权边时,调用多次 Dijkstra算法能求出每对顶点间最短路径
  • C.当图中存在负权回路时,调用一次 Dijkstra算法也一定能求出源点到所有点的最短路
  • D.当图中存在负权边时,Dijkstra + 堆优化算法可以求出源点到所有点的最短路

14. 数列{an}是等差数列,首项 a1>0, a2020+a2021>0, a2020*a2021<0,则使前n 项和sn≥0成立的最大项数n是( )。

  • A.2020
  • B.4040
  • C.4041
  • D.4042

15. 给定长为n (n≤1000)的字符串,每次可以将连续一段回文序列消去,消去后左右两边会 接到一起,求最少消去几次能消完整个序列(单个字符也算回文字符串)。设f(i,j)表示消去闭区间[i,j]内字符串所需要的最小次数,那么当1≤i≤j≤n时,在不考虑回文串的情况下,f(i,j)的动态规划方程中包含( )。

  • A.$min_{i\leq k < j}\{f(i,k)+f(k+1,j)\}$
  • B.$min_{i\leq k < j}\{f(i,k)+f(k+1,j)\}+1$
  • C.$min_{i\leq k < j}\{f(i,k)*f(k+1,j)\}$
  • D.$f(i,k)+f(k+1,j), i\leq k < j $

二、阅读程序(程序输入不超过数组或字符串定义的范围;除特殊说明外,判断题1.5分,选择题4分,共计40分)

1.

# include <iostream>
# include <cstdio>
using namespace std;
int L, ans;
char a[2002][2002];
int cross(int x, int y) {
int length=1;
if(x<=1||x>=L)return 1;
for (int i=1;; i++) {
if(x-i<=0||x+i>=L+1) return length;
else if (a[x-i][y]!=a[x+i][y]) return length;
else length +=2;
}
}
int down(int x, int y) {
int length=1;
if(y<=1||y>=L) return 1;
for (int i=1;; i++) {
if(y-i<=0||y+i>=L+1)return length;
else if (a[x][y-i]!=a[x][y+i]) return length;
else length += 2;
}
}
int MAXN(int a, int b) {
if(a >= b) return a;
else return b;
}
int main() {
cin>>L;
for(int i=1; i<=L; i++)
for(int j=1; j<=L; j++)
cin>>a[i][j];
int x, y;
cin>>x>>y;
ans=MAXN(cross(x,y),down(x,y));
cout<<ans;
return 0;
}

判断题

1) 第35行若改成 MAXN(down(x,y), cross(x,y)),运行结果不变。()
2) 第34行输入值包含0时,程序可能会产生Runtime Error。( )
3) 程序输出的ans可能等于0。( )
4) 当第34行输入值x>y时,cross(x,y)返回值必然大于down(x,y)返回值。( )

选择题

5) 对于输入的L×L.的字符矩阵,ans值最大是( )。
6) 若输入L=5,x=y=3,aij={{abcba} , {bcdcb} ,{cdedc},{bcdcb},{abcba}},则输出是( )。

2.

#include <cstdio>
#include <cmath>
const int N = 1e9;
int isnp[50005],p[50005],pcnt;

inline void getPrime(const int n = sqrt(N)) {
isnp[0]= isnp[1]=1;
for (register int i=2; i<=n; ++i) {
if (!isnp[i]) p[pcnt++]=i;
for (register int j=0; i*p[j]<=n && j<pcnt; ++j) {
isnp[i*p[j]]=1;
if (!(i% p[j])) break ;
}
}
}

int main() {
getPrime(); int n;
while (scanf(" %d", &n) && n) {
int _sqrt = sqrt(n),ans= n;
for (register int j = 0; p[j]<=_sqrt && j<pcnt; ++j) {
if (n % p[j]==0) {
while (n % p[j]==0)n/=p[j];
ans = 1ll * ans *(p[j]-1)/ p[j];
}
}
if (n!=1) ans = 1ll* ans * (n-1)/n;
printf("%d\n", ans);
}
return 0;
}

判断题

1) 若去掉第12行,程序也能得到正确结果。()
2) 若去掉第23行,程序也能得到正确结果。()
3) 若输入的 n≤10^8,则第10行j<pcnt条件可以省略。()
4) 若输入的 n≤10^8,则第21行j<pcnt条件可以省略。()

选择题

5) 当n=504时,输出ans 为() 。
6) getPrime函数的时间复杂度是( ) 。

3.

#include <iostream>
using namespace std;

const int inf =0x3f3f3f3,N=4e5+5;
struct edge {
int to,nt ;
}E[N<<1];
int cnt, n,m,rt,MX;
int H[N],sz[N],mxs[N];
void add_edge(int u, int v) {
E[++cnt]=(edge) {v,H[u]};
H[u]=cnt;
}
void dfs(int u, int fa) {
sz[u]=1;
for (int e=H[u]; e; e=E[e].nt) {
int v=E[e].to;
if (v==fa) continue;
dfs(v,u);
sz[u]+=sz[v];
mxs[u]=max(mxs[u],sz[v]);
}
mxs[u] =max(mxs[u],n-sz[u]);
if (mxs[u]<mxs[rt])rt=u;
if (mxs[u]==mxs[rt] &&u<rt)rt=u;
}
int main() {
cin>>n,
rt =cnt= 0;
for (int i=1; i<=n; i++) {
int u,v;
cin>>u>>v;
add_edge(u,v);
add_edge(v,u);
}
mxs[0] = inf ;
dfs(1,0);
cout<<rt<<' '<<mxs[rt]<<'\n';
return 0;
}

判断题

1) 第33,34行只需保留任意一行也不会影响程序的正确性。()
2) 第37行函数调用dfs(x,y),只需保证1≤x≤n,y≤0即可。()
3) 第32行输入若有重复(重边),不影响输出结果的正确性。()
4) 程序运行结束时可能存在正整数i(i≤n)使sz[i]等于mxs[i]。()

选择题

5) n=6,二元组(u,v)各个值分别是{(1,3),(6.3),(2,6),(5,6),(3,4)},则输出是()。
6) 若n=1000,则程序运行后mxs[]数组中除初始值 inf 外,最大值是( )。

三、完善程序(单选题,每题2.5分,共计30分)

1. (翻硬币)
一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们整体一起翻面后放回原处(如101111前5个翻面结果是000101),再取3枚,取4枚……直至m枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中每一枚又是正面朝上为止。例如,m为1时,翻两次即可;m 为4时﹐翻11次;m为9时,翻80 次。
【输入】
仅有的一个数字是这摞硬币的枚数m(0 <m < 1000),
【输出】
为了使这握硬币中的每一枚都是正面朝上所必须翻的次数。
【输入样例】
30
【输出样例】
899


#include <iostream>
using namespace std;
int solve(int m);
int main() {
freopen("demo.out","w", stdout);
int m;
do {
scanf("%d",&m);
if(m>0 && m<1000)
printf("%d\n",___(1)___);
} while (m>0 && m< 1000);
return 0;
}

int solve(int m) {
int i,t,s;//翻转的次数
int flag;
if(m==1)
s=___(2)___;
else {
d=2*m+1;
//确定硬币是经过偶数次翻转还是奇数次翻转
t= 2;
//表示一个COIN必须翻转偶数次,才能从正面继续翻到正面
i=1;//翻转的轮数,每轮为从1翻转到m
flag=0;//退出循环标志,翻转完成标志
do {
if(t==1) {
s=___(3)___;
flag = 1;
} else if(___(4)___) {
s=i*m-1;
flag=1;
} else {
t=___(5)___;
}
i=i+1;
} while(!flag);
}
return s;
}


选择题

1) ①处应填( )
2) ②处应填( )
3) ③处应填( )
4) ④处应填( )
5) ⑤处应填( )

2. (FBZ串问题)
已知一个由0,1字符组成的长度为2^n的字符串。请按以下规则分解为FBZ串:
·若其中字符全为1,则称其为B串:
·若其中字符全为0,则称其为Z串;
·若不全为0,也不全为1,则称F串。
若此串为F串,则应将此串分解为2个长为2^(i-1)的子串。对分解后的子串,仍按以上规则继续分解直到全部为B串或为Z串为止。例如n=3时,给出0-1串为“10111001”

最后输出:FFFBZBFFBZFZB。给定一个0-1串,分解成FBZ串。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int n= 8;
char str1[2*n][n];
char str2[40]=" ";
int main() {
int s1,s2,x,s,t;
s1=s2=x= 0;
gets(str1[0]);
while(___(1)___) {
s=t=0;
for (int i = 0; i< n; i++) {
if (str1[s2][i]=='1')
s++;
if (str1[s2][i]=='0')
t++;
}
if(___(2)___)
str2[x++]='B';
else if(___(3)___)
str2[x++]='Z';
else {
str2[x++]='F';
int j=(s+t)>>1;
for (int k=n*2-2; k>=___(4)___; k--)
for (int i=0; i<n; i++)
str1[k+2][i]=str1[k][i];
s1 += 2;
for (int i=0; i<j; i++) {
str1[s2+1][i]=str1[s2][i];
str1[s2+2][i]=___(5)___;
}
for (int i=___(6)___; ___(7)___; i++) {
str1[s2+1][i]=' ';
str1[s2+2][i]=' ';
}
}
s2++;
}
puts(str2);
return 0;
}


选择题

1) ⑴处应填( )
2) ⑵处应填( )
3) ⑶处应填( )
4) ⑷处应填( )
5) ⑸处应填( )
6) ⑹处应填( )
7) ⑺处应填( )