[全站最详细]2023CSP入门级 答案详解(二)

二、  阅读程序(程序输入不超过数组成字符串定义的范围:判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分,共计40分)

(1)

01 #include<iostream>02 #include<cmath>03 using namespace std;04 05 double f(double a,double b,double c){06     double s=(a+b+c)/2;07     return sqrt(s*(s-a)*(s-b)*(s-c));08 }0910 int main(){11    cout.flags(ios::fixed);12    cout.precision(4);13    14     int a,b,c;15    cin>>a>>b>>c;16    cout<<f(a,b,c)<<endl;17    return 0;18 }

假设输入的所有数都为不超过1000的正整数,完成下面的判断题和单选题:

判断题

16.  (2分)当输入为“2 2 2”时,输出为“1.7321”( )

17.  (2分)将第7行中的"(s-b)*(s-c)"改为"(s-c)*(s-b)"不会影响程序运行的结果( )

18. (2分)程序总是输出四位小数( )

单选题

19.  (3分)当输入为“3 4 5”时,输出为( )

A.  "6.0000" B. "12.0000" C. "24.0000" D. "30.0000"

20.  (3分)当输入为“5 12 13”时,输出为( )

答案: TTTAB   

海伦公式。这段代码是一个计算三角形面积的程序。代码中包含了输入三个变量a、b、c,表示三角形的三边长度。然后通过函数f计算三角形的面积,并通过cout输出结果。

代码的大致执行过程如下:

1. 引入iostream和cmath库。

2. 使用命名空间std。

3. 定义函数f,接收三个double类型参数a、b、c,计算并返回三角形的面积。

4. 在main函数中,设置cout的输出格式为固定小数位数(precision)为4位。

5. 定义整型变量a、b、c。

6. 通过cin读取用户输入的三角形的三边长度。

7. 调用函数f计算三角形面积,并通过cout输出结果。

8. 返回0,表示程序执行成功结束。

这段代码的作用是计算给定三角形的面积,并输出结果。

注意:在使用这段代码前需要确保输入的三边长度满足构成三角形的条件,否则可能会导致计算错误或异常。

(2)

01 #include<iostream>02 #include<vector>03 #include<algorithm>04 using namespace std;05 06 int f(string x,string y){07     int m=x.size();08     int n=y.size();09     vector<vector<int>>v(m+1,vector<int>(n+1,0));10    for(int i=1;i<=m;i++){11        for(int j=1;j<=n;j++){12             if(x[i-1]==y[j-1]){13                 v[i][j]=v[i-1][j-1]+1;14             }else{15                 v[i][j]=max(v[i-1][j],v[i][j-1]);16             }17         }18     }19     return v[m][n];20 }2122 bool g(string x,string y){23     if(x.size() != y.size()){24         return false;25     }26     return f(x+x,y)==y.size();27 }2829 int main(){30     string x,y;31     cin>>x>>y;32     cout<<g(x,y)<<endl;33     return 0;34 }

判断题

21.  (1.5分)f函数的返回值小于等于min(n,m)。( )

22. (1.5分) f函数的返回值等于两个输入字符串的最长公共子串的长度。( )

23.  (1.5分)当输入两个完全相同的字符串时,g函数的返回值总是true( )

单选题

24.  (3分)将第19行中的“v[m][n]”替换为“v[n][m]”,那么该程序( )

25.  (3分)当输入为“csppsc spsccp”时,输出为:( )

答案: TFTBBD

这段代码实现了一个字符串匹配的功能。代码中定义了两个函数f和g,以及一个主函数main。

函数f接收两个字符串x和y作为参数,通过动态规划的方法计算x和y的最长公共子序列的长度,并返回结果。

函数g接收两个字符串x和y作为参数,首先判断它们的长度是否相等,如果不相等则直接返回false。接下来,将字符串x复制拼接一次得到x+x,并调用函数f计算x+x和y的最长公共子序列的长度。如果最长公共子序列的长度等于y的长度,则返回true,否则返回false。

主函数main中,读取用户输入的两个字符串x和y,然后调用函数g判断它们是否匹配,并通过cout输出结果。

总体来说,这段代码的功能是判断两个字符串是否匹配,即判断其中一个字符串是否是另一个字符串的循环位移(cyclic shift)。

注意:在使用这段代码之前,需要确保输入的字符串x和y合法,且不会导致数组越界等异常情况。

(3)

01 #include <iostream>02 #include <cmath>03 using namespace std;04 05 int solve1(int n){06     return n*n;07 }0809 int solve2(int n){10    int sum=0;11    for(int i=1;i<=sqrt(n);i++){12         if(n%i==0){13             if(n/i==i){14                 sum+=i*i;15             }else{16                 sum+=i*i+(n/i)*(n/i);17             }18         }19     }20     return sum;21 }2223 int main(){24     int n;25     cin>>n;26     cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;27     return 0;28 }

假设输入的n是绝对值不超过1000的整数,完成下面的判断题和单选题。

判断题

27.  (2分)如果输入的n为正整数,solve2函数的作用是计算n所有的因子的平方和( )

28. (2分) 第13~14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次( )

29.  (2分)如果输入的n为质数,solve2(n)的返回值为n2+1( )

单选题

30.  (4分)如果输入的n为质数p的平方,那么solve2(n)的返回值为( )

A.  p2+p+1 B. n2+n+1 C. n2+1 D. p4+2p2+1

31.  (3分)当输入为正整数时,第一项减去第二项的差值一定( )

A.  大于0 B. 大于等于0且不一定大于0 C. 小于0 D. 小于等于0且不一定小于0

32. (3分) 当输入为“5”时,输出为( )

A.  "651.625" B. "650.729" C. "651.676" D. "652.625"

答案: TTTBDC

这段代码实现了一个数学计算的功能。代码中定义了两个函数solve1和solve2,以及一个主函数main。

函数solve1接收一个整数n作为参数,计算并返回n的平方。

函数solve2接收一个整数n作为参数,在循环中找到n的所有因子,并计算它们的平方和。具体做法是从1遍历到sqrt(n),如果n能被当前遍历的数整除,则判断n/i是否等于i,如果相等说明是平方数,将其平方添加到sum中,否则同时将i的平方和n/i的平方添加到sum中。最后返回sum。

主函数main中,读取用户输入的一个整数n,先调用solve1计算n的平方,然后再调用solve2计算solve1结果的平方和,以及调用solve1计算solve2结果的平方。通过cout输出这两个结果。

总体来说,这段代码的功能是对给定的整数n进行数学运算,并输出结果。

需要注意的是,在使用这段代码之前,需要确保输入的整数n合法,且不会导致数值溢出或其他异常情况。

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

(1)(寻找被移除的元素)

问题:原有长度为 n+1公差为1等升数列,将数列输到程序的数组时移除了一个元素,导致长度为 n 的开序数组可能不再连续,除非被移除的是第一个或最后之个元素。需要在数组不连续时,找出被移除的元素。试补全程序。

01 #include <iostream
02 #include <vector>
03
04 using namespace std;
05
06 int find missing(vector<int>& nums) (
07 int left = 0, right = nums.size() - 1;
08while (left < right){
09   int mid = left + (right  left) / 2;
10   if (nums[mid] - mid+ ①) (
11        ②;
12    }else{
13      ③
14    }
15   }
16  return ④;
17 }
18
19 int main() (
20    int n;
21 cin >> n;
22 vector<int> nums(n);
23 for (int i= 0; i< n; i++) cin >> nums[i];
24 int missing_number = find_missing(nums);
25 if_(missing_number == ⑤) {
26     cout << "Sequence is consecutive" << endl;
27 }else{
28    cout << "Missing number is " << ,missing numbeer << endl;
29 }
30 return 0;
31 }

33.  ①处应填( )

A.  1 B.nums[0] C.right D.left

34.  ②处应填( )

A.  left=mid+1 B.right=mid-1 C.right=mid D.left=mid

35.  ③处应填( )

A.left=mid+1 B.right=mid-1 C.right=mid D.left=mid

36.  ④处应填( )

A.left+nums[0] B.right+nums[0] C.mid+nums[0] D.right+1

37.  ⑤处应填( )

A.nums[0]+n B.nums[0]+n-1 C.nums[0]+n+1 D.nums[n-1]

答案: BACBD

注意:第四个有可能选A。暂定B

这段代码实现了一个在连续的整数序列中查找缺失数字的功能。代码中定义了一个函数find_missing,以及一个主函数main。

函数find_missing接收一个整数数组nums作为参数,在while循环中对数组进行二分查找。首先,定义左右指针left和right分别指向数组的首尾元素。在每次循环中,计算中间位置mid,并判断nums[mid]是否等于mid+1,如果是,则说明缺失的数字在[mid+1, right]之间;否则说明缺失的数字在[left, mid]之间。根据这个判断,更新left和right的值,继续进入下一轮循环直到left=right时退出循环。最后返回结果left+1。

主函数main中,读取用户输入的整数n,并依次读取n个整数存储到数组nums中。然后调用find_missing函数查找缺失数字,并根据返回结果输出相应的信息。如果返回的结果是nums.size(),即没有找到缺失数字,就输出"Sequence is consecutive";否则输出"Missing number is "和缺失的数字。最后程序返回0。

需要注意的是,在使用这段代码之前,需要确保输入的数组nums是连续的整数序列,且没有重复元素。

(2)  (编辑距离)

给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。

1.#include <iostream>
2.#include <string>
3.#include <vector>
4.using namespace std;
5. 
6.int min(int x,int y,int z){
7. return min(min(x,y),z);
8.}
9. 
10.int edit_dist_dp(string str1,string str2){
11. int m=str1.length();
12. int n=str2.length();
13. vector<vector<int>> dp(m+1,vector<int>(n+1));
14. 
15. for(int i=0;i<=m;i++){
16. for(int j=0;j<=n;j++){
17. if(i==0)
18. dp[i][j]=(1);
19. else if(j==0)
20. dp[i][j]=(2);
21. else if((3))
22. dp[i][j]=(4);
23. else
24. dp[i][j]=1+min(dp[i][j-1],dp[i-1][j],(5)); 
25. }
26. }
27. return dp[m][n];
28.}
29. 
30.int main(){
31. string str1,str2;
32. cin>>str1>>str2;
33. cout<<"Mininum number of operation:"
34. <<edit_dist_dp(str1,str2)<<endl;
35. return 0; 
36.}

38.  ①处应填( )

A.j B.i C.m D.n

39.  ②处应填( )

A.j B.i C.m D.n

40.  ③处应填( )

A.  str1[i-1]==str2[j-1] B. str1[i]==str2[j] 

C.  str1[i-1]!=str2[j-1] D. str1[i]!=str2[j]

41.  ④处应填( )

A.  dp[i-1][j-1]+1 B. dp[i-1][j-1]

C. dp[i-1][j] D. dp[i][j-1]

42.  ⑤处应填( )

A.  dp[i][j] + 1 B. dp[i-1][j-1]+1

C. dp[i-1][j-1] D. dp[i][j]

答案: ABABC

第三个也有小概率选B

这段代码实现了计算两个字符串之间的编辑距离(Levenshtein距离)的功能。代码中定义了一个函数min用于返回三个整数中的最小值,以及一个函数edit_dist_dp用于计算编辑距离,还有一个主函数main。

函数min接收三个整数x、y和z作为参数,通过嵌套调用min函数来找到其中的最小值,并返回结果。

函数edit_dist_dp接收两个字符串str1和str2作为参数,使用动态规划的思想计算str1和str2之间的编辑距离。首先,获取两个字符串的长度m和n,并创建一个二维向量dp,大小为(m+1)×(n+1)。然后,使用两层循环遍历所有可能的子问题。在循环中,根据当前位置(i, j)的情况,将dp[i][j]的值更新为以下情况之一:(1)当i等于0时,即str1为空字符串,那么dp[i][j]的值为j,表示需要进行j次插入操作;(2)当j等于0时,即str2为空字符串,那么dp[i][j]的值为i,表示需要进行i次删除操作;(3)当str1[i-1]等于str2[j-1]时,即当前字符相等,那么dp[i][j]的值等于dp[i-1][j-1],表示不需要进行操作;(4)否则,dp[i][j]的值等于1加上dp[i][j-1](插入操作)、dp[i-1][j](删除操作)和dp[i-1][j-1](替换操作)中的最小值。

最后,返回dp[m][n],即两个字符串之间的编辑距离。

主函数main中,读取用户输入的两个字符串str1和str2,并调用edit_dist_dp函数计算它们之间的编辑距离。然后输出结果"Mininum number of operation:"以及计算得到的编辑距离。最后程序返回0。

请注意,在使用这段代码之前,需要确保输入的字符串合法且不为空。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2023 csp-j入门级第一轮试题是中国计算机科学会议(CSP)针对初学者设计的一道题。根据题目的具体要求,试题内容可能涉及算法、编程语言、数据结构等方面的知识。 对于这样的试题,学生们需要运用自己所学的知识和技能,通过编程实现题目要求。例如,可能需要设计一个算法来解决一个具体的问题,或者使用特定的数据结构来组织和处理数据。 为了完成这样的试题,学生们首先需要理解题目的要求和限制条件,确保对题目中涉及的概念和术语有所了解。接下来,他们需要分析问题,确定解决问题的方法和步骤。在实际编程实现时,可以选择合适的编程语言和工具,并按照题目要求进行编码。 在完成编码后,学生们需要进行测试和调试,确保程序能够正确运行并得到正确的结果。在测试过程中,可以使用一些已知的测试用例来验证程序的正确性,并对程序进行优化,以提高其性能。 最后,将代码提交,并等待评审结果。评审过程可能涉及代码质量、算法复杂度、正确性等方面的考量。根据评审结果,学生们可以了解自己的编程水平和不足之处,并进行相应的学习和提高。 总体来说,解答2023 csp-j入门级第一轮试题需要学生在编程基础上运用算法和数据结构的知识,进行问题的分析和解决。通过这样的学习和实践,学生们可以提高自己的编程能力,并逐渐成长为优秀的程序员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_L.Y.H._

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值