a--6:2023年CSP-J初赛原创模考大赛(7月赛)

时间:2024-07-25 14:51:07 分类:普及组CSP-J模拟题

2023年CSP-J初赛原创模考大赛(7月赛)

(C++语言    满分:100分    考试时间:120分钟)

单项选择题(每题只有一个正确选项,每题2分,共30分)

1. 摩尔定律(Moore‘s law)是由英特尔创始人之一戈登·摩尔(Gordon Moor)提出来的。根据摩尔定律,单块集成电路的集成度是6年前的( )倍。

A. 4    B. 8   C. 16    D. 32

2. 关于汇编语言,下列说法正确的是(    )。

A. 是一种与软件相关的高级程序设计语言    

B. 在编写复杂程序时,相对于高级语言而言代码量较大,但更易调试    

C. 可以直接访问寄存器、内存单元、以及I/O端口

D. 随着高级语言的诞生,如今已完全被淘汰,不再使用

3. 如果主存容量为16MB,且按字节编址,则表示该主存地址至少需要(   )位。

A. 16    B. 24    C. 26    D. 32

4. 当输入&%¥#*1234时,以下程序结束后,x=( )。

int x = 0; char ch = getchar();

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

while(ch >= '0' && ch <= '9') {

x = (x << 1) + (x << 3) + ch – '0';

ch = getchar();

}

A. 0    B. 4321    C. 1234    D. 无法确定

5. 十进制数字2020转化为二进制数字为(   )。

A. 11111100100      B. 11110110100     C. 11111101100     D. 11110100100

6. 班级中A、B、C、D四名同学参加百米竞赛,甲、乙、丙三位同学对比赛结果进行了预测,预测结果如下:

甲:C第一,B第二

乙:C第二,D第三

丙:A第二,D第四

比赛结果发现,甲、乙、丙三位同学各预测对了一半,试问比赛结果排名是(  )。

A. ABCD    B. BCAD    C. CADB    D. CDAB

7. 设 a=true, b=false, c=false,以下逻辑运算表达式值为假的是(   )。

A. (a∨c)∨b∧a    B. a∧(c∨b)∧c    C. (c∧b)∨a    D. (a∨b)∧(a∨c)

8. 后缀表达式的1 7 3 5 + * + 9 +计算结果为(    )。

A. 38    B. 66    C. 72    D. 80

9. 链表具有的特点是(    )。

A. 可随机访问任一元素    

B. 必须事先估计存储空间    

C. 插入删除不需要移动元素    

D. 所需空间与线性表长度成反比

10. 一棵结点数为4068 的二叉树最少有(    )个叶子结点;二叉树的根节点高度为 1,一棵结点数为2048的二叉树最小的高度值是(    )。

A. 2020 11    B. 1 11    C. 1 12    D. 2020 12

11. 将20个相同的苹果放进3个相同的盘子,每个盘子至少放一个苹果,共有(    )种方法。

A. 30    B. 33    C. 43    D. 64

12. 一棵二叉树有10个叶子节点,则总节点数不可能是(    )。

A. 18    B. 31    C. 32    D. 2022

13. 5个男生,4个女生共9人站成一排,要求5个男生必须相邻。有多少种排法?

A. 4!×4!      B. 5!×5!       C. A_9^5×A_4^4      D. C_9^5×A_4^4

14. 一个序列的入栈顺序为abcdefg,请问下面四种出栈顺序中合法的有(    )个。

1)abcdefg  2) gfedcba  3) cbdefag  4) efcdbag

A. 1     B. 2     C. 3      D. 4 

15. 以下逻辑表达式的值恒为真的是(    )。

A. P∨(¬P∧Q)∨(¬P∧¬Q)         B. Q∨(¬P∧Q)∨(P∧¬Q)      

C. P∨Q∨(P∧¬Q)∨(¬P∧Q)       D. P∨¬Q∨(P∧¬Q)∨(¬P∧¬Q)


二、程序阅读理解题(共3大题,共计40分)

1. (13分)

输入是一个长度不超过1000的,只有大写字母构成的字符串,请完成下列的判断题和单选题:

01 #include<cstdio>

02 #include<cstring>

03 #include<iostream>

04 using namespace std;

05 char str[1005];

06 int main(){

07 scanf("%s",str);

08 int len = strlen(str);

09 int l = 0, r = len - 1, tmp;

10 while(l < r){

11 while (str[l] % 2 == 0 && l < r){

12 swap(str[l], str[r]);

13 r--;

14 }

15 l++;

16 }

17 printf("%s", str);

18 return 0;

19 }

判断题

(1)输出的字符串由大写字母组成,并且所有相邻的字符最多只有一对ASCII码的奇偶性不同。(   )(1.5分)

(2)如果输入的字符串长度为n,那么程序的时间复杂度是O(n2),而不是O(n)。(   )(1.5分)

(3)将程序的第10行和第11行的while中的l < r改为l <= r,则对于相同的输入,程序输出不会发生改变。(   )(2分)

(4)如果输入的字符串只由两种不同的字母组成,那么输出的字符串中所有相邻的字符最多只有一对字符不相同。(   )(2分)


选择题

(5)如果输入是ABCDEF,那么程序输出。(   )(3分)

A. AEDCFB    B. AECDFB   C. ACEDBF    D. AFCDEB

(6)如果输入的字符串长度为n,那么程序中的swap操作最多执行(   )次(3分)

A. ⌊n/2⌋     B. ⌊n/2⌋+1    C. n-1    D. n


2. (13.5分,判断题1.5分,选择题3分)

01 #include<bits/stdc++.h>

02 using namespace std;

03 string s;

04 void f(){

05 char c;

06 if(!(cin >> c)){

07 cout << "invalid input\n";

08 exit(0);//结束整个程序 

09 }

10 if(c == '#'){

11 s += '#';

12 return;

13 } 

14 f();

15 f();

16 s += c;

17 }

18 int main(){

19 f();

20 cout << s;

21 return 0;

22 }


假设输入是只包含大小写字母以及 '#' 的字符串 。请完成下列的判断题和单选题:

判断题

(1)程序的输入如果以 '#' 开头,则输出可能是invalid input。(     )

(2)程序的输入如果不以 '#' 开头,则输出长度至少为3。(     )

(3)若输入中的字母个数为a(a≠0), ‘#’ 号的个数为b,输出中的字母个数为a,且输出不为invalid input,则b的最小值是a+1。(    )

选择题

(4)若输入为 ADa##E#G##CF### 时,输出为(   )。

A. ##A##D#aE###GCF    B. ##a###GED##F#CA

C. a#DE#G##A##FC##    D. invalid input

(5)若输入为 ABC####ABC#### 时,输出为(      ) 。

A. AB##CA#BC    B.  C##B##A##CB#A# 

C.  ##C#B#A        D.  invalid input

(6)如果输入是由A、B、C、D、E各一个和6个'#',共11个字符组成的字符串,并且A、B、C、D、E的相对顺序和字母顺序相同。则输出共有(   )种可能。

A. 66      B. 65      C. 64      D. 63


3. (13.5分,判断题1.5分,选择题3分)

假定输入的n是不超过106的正整数,val[1...n]都是正整数, 并且总和不超过231-1。val[1...n]为升序排列。

01 include<bits/stdc++.h>

02 using namespace std;

03 int n, m, s, e, head[105], to[205], nxt[205];

04 bool v[100005];

05 vector<int> a;

06 void dfs(int u) {

07 v[u] = 1;

08 a.push_back(u);

09 if(u == e) {

10 for(int i = 0; i < a.size(); i++)

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

12 printf("\n");

13 v[u] = 0;

14 a.pop_back();

15 return;

16 }

17 for(int i = head[u]; i; i = nxt[i])

18 if(!v[to[i]]) dfs(to[i]);

19 v[u] = 0;

20 a.pop_back();

21 }

22

23 int main() {

24 scanf("%d%d", &n, &m);

25 for(int i = 1; i <= m; i++) {

26 int u, v;

27 scanf("%d%d", &u, &v);

28 to[i] = v;

29 nxt[i] = head[u];

30 head[u] = i;

31 }

32 scanf("%d%d", &s, &e);

33 dfs(s);

34 return 0;

35 }


假设输入的n代表一张图中的顶点数 (1<n≤100),m代表边数 (0<m≤200),u和v描述了一条从u到v的有向边,最终查询以s为起点,以e为终点的所有简单路径 (0<u,v,s,e≤n,u≠v,s≠e),完成下面的判断题和单选题:

判断题

(1)只要输出数据不为空,则输出的每一行至少包含两个数字。(    )

(2)如果输出数据为空,说明输入数据描述的图不满足强连通。(     )

(3)该程序的最坏时间复杂度为O(n×m)。(     )

选择题

(4)输入以下数据后,输出的数据为(     )。

输入数据:

4 5

2 4

1 2

3 4

1 3

3 2

1 4

A.

1 2 4

1 3 4

1 3 2 4

B.

1 3 4

1 3 2 4

1 2 4

C.

1 2 4

1 3 2 4

1 3 4

D.

1 3 2 4

1 3 4

1 2 4


(5)当输入数据满足以下(   )条件时,不论s和e如何改变,输出数据一定为一行。(     )

A. m=n−1,第i条边满足u_i =i,v_i =i+1

B. m=n,第i条边的u和v满足u_i =i,v_i =i+1,其中第m条边满足u_m =n,v_m =1

C. m=n−1,第i条边满足u_i =i+1,v_i <u_i 

D. m=n−1,第i条边满足v_i =i+1,u_i <v_i 

(6)如果n=7,输出数据的行数最多为(   )。

 A. 5    B. 206    C. 326    D. 720


三、程序完善题(共2大题,每个选择题3分,共计30分)

1.      

现有一个长度为n的数组a,我们把数组的相等性看成数组中相邻的相等数字的对数,即当1 ≤ i ≤ n−1时,ai = ai+1的数字对个数。现在对于数组a,我们可以进行以下操作:选择两个整数i和x(1 ≤ i ≤ n−1,1 ≤ x ≤ 109),可以把ai和ai+1设为x。求使得该数组的相等性小于等于1的最小操作数。

输入描述:

第一行一个整数n (2 ≤ n ≤ 2×105),表示数组a的长度;第二行n个元素表示数组a里每个元素的值ai(1 ≤ ai ≤ 109)。

输出描述:

最小需要的操作数。

输入样例:


        5


        2 1 1 1 2


输出样例:


        1


 


01 #include<bits/stdc++.h>

02 using namespace std;

03 int main() {

04  int n, temp, cnt = 0;

05  cin >> n;

06  vector<int> a;

07   while (cnt != n) {

08     cin>>temp;

09     a.push_back(temp);

10     cnt++;

11  }

12  int minv = n;

13  int maxv = -1;

14  for(int i = 0; ① ; i++) {

15     if(a[i] == a[i+1]) {

16         minv = min(minv, i);

17         ②;

18     }

19  }

21  if(③ || minv == maxv) {

22     cout << 0 << '\n';

23  } else if(④){

24     cout << 1 << '\n';

25  } else {

26     cout << (⑤) << '\n';

27  }

28  return 0;

29 }


(1)①处应填(    )。

A. i < n      B. i + 1 < n      C. i + 1 <= n      D. i - 1 <= n

(2)②处应填(    )。

A. if (maxv > i) maxv = i +1;    B. if (maxv > i) maxv = i;

C. if (maxv < i) maxv = i;       D. if (maxv < i) maxv = i +1;

(3)③处应填(    )。

A. maxv == -1    B. maxv == n    C. maxv == 0    D. maxv =  -1

(4)④处应填(    )。

A. maxv - minv == 0    B. maxv - minv == 1

C. maxv - minv == 2    D. maxv - minv == -1

(5)⑤处应填(    )。

A. maxv – minv       B. maxv - minv + 1

C. max(maxv, minv)    D. maxv - minv – 1

2.    一个数轴上,有n+1个传送点,位于: 0, a1,a2,a3,...,an的位置。如果从传送点x到传送点y,需要消耗: (x−y)2 的能量,且x、y必须都是传送点。

问:若想从数轴: 0 点到:an点,在现有n+1个传送点的前提下,若要消耗的总能量不超过m,最少需要再铺设几个传送点。(注意:传送点只能在整数点上)

输入描述:

第一行1个整数n(1≤n≤2×105)

第二行n个整数a1,a2,a3,...,an(1<a1<a2<a3<...<an≤109)

第三行1个整数m(an≤m≤1018)

输出描述:

输出一个整数,表示从0 点到an点,在现有n+1个传送点的前提下,若要消耗的总能量不超过m,最少需要再铺设传送点的个数。

输入样例:


        2


        1 5


        7


输出样例:


        2


01 #include<bits/stdc++.h>

02 using namespace std;

03 typedef long long ll;

04 const int N=2e5+5;

05 int n,a[N],c[N],d[N];

06 ll m,l,r,ans,sum,cnt;

07 //长度是n,分成k段

08 ll f(int len,int k) {

09  return lll * (k-len%k)*(len/k) * (len/k)

10     + lll * len%k*(len/k +1)*(len/k +1);

11 }

12 bool check(ll x)

13 {

14  sum=cnt=0;

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

16  {

17     ll l=2,r=d[i],ans=l;

18     while(l<=r)

19     {

20         ll mid=(l+r)>>1;

21         if(①>=x) ans=mid,l=mid+1;//填空

22         else r=mid-1;

23     }

24     cnt = ②;//填空

25     sum = ③;//填空

26  }

27  return sum<=m;

28 }

29 int main()

30 {

31  scanf("%d",&n);

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

33  {

34     scanf("%d",&a[i]);

35     d[i]=a[i]-a[i-1];

36  }

37  scanf("%lld",&m);

38  l=0,r=1e18,ans=-1;

39  while(④) //填空

40  {

41     ll mid= l + r >> 1;

42     if(check(mid)) l = mid;

43     else r = mid;

44  }

45     ans = ⑤;//填空

46  check(ans);

47  printf("%lld\n",cnt-(m-sum)/ans);

48  return 0;

49 }

(1)①处应填写(    )。

A. f(d[i], mid-1) - f(d[i], mid)      B. f(d[i], mid) - f(d[i], mid+1)

C. f(d[i], mid+1) - f(d[i], mid+2)    D. f(d[i], mid)

(2)②处应填写(    )。

A. ans       B. ans - 1    C. cnt + ans     D. cnt + ans - 1

(3)③处应填写(    )。

A. f(d[i], ans)     B. f(d[i], ans-1)     C. sum + f(d[i], ans)     D. sum + f(d[i], ans-1)

(4)④处应填写(    )。

A. r - l >= 0         B. r - l > 0        C. r - l > 1         D. r - l > 2

(5)⑤处应填写(    )。

A. l         B. r         C. l + 1         D. r + 1


答案:----->E:\csp\初赛集训模拟题试题包\23年有道小图灵\2023J组7月赛