CSP-J 2021 入门级 第一轮 完善程序(1)

【题目】

CSP-J 2021 入门级 第一轮 完善程序(1)
(1)(Josephus 问题)有n个人围成一个圈,依次标号0至n-1。从0号开始,依次0,1,0,1,… 交替报数,报到 1 的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。
试补全模拟程序。

01 #include <iostream>
02 
03 using namespace std;
04
05 const int MAXN = 1000000;
06 int F[MAXN];
07
08 int main() {
09     int n
10     cin >> n;
11     int i = 0, p = 0, c = 0;
12     while(__(1)__) {
13         if(F[i] == 0) {
14             if(__(2)__) {
15                 F[i] = 1;
16                 ___(3)___;
17             }
18             ___(4)___
19         }
20         ___(5)___;
21     }	
22     int ans = -1;
23     for (i = 0; i < n; i++)
24         if (F[i] == 0)
25             ans = i;
26     cout << ans << endl;
27     return 0;
28 }
  1. ①处应填( )
    A.i < n
    B.c < n
    C.i < n- 1
    D.c < n-1

  2. ②处应填( )
    A.i % 2 == 0
    B.i % 2 == 1
    C.p
    D.!p

  3. ③处应填( )
    A.i++
    B.i = (i + 1) % n
    C.c++
    D.p ^= 1

  4. ④处应填( )
    A.i++
    B.i = (i + 1) % n
    C.c++
    D.p ^= 1

  5. ⑤处应填( )
    A.i++
    B.i = (i + 1) % n
    C.c++
    D.p ^= 1
    **

【题目考点】

1. 数组循环遍历
2. 位运算

【解题思路】

该问题为报数只从0报到1的约瑟夫问题,最后输出的是剩下的人。

22     int ans = -1;
23     for (i = 0; i < n; i++)
24         if (F[i] == 0)
25             ans = i;
26     cout << ans << endl;

通过看最后一段可知,遍历F数组,找到其中值为0的元素的下标保存在ans变量,而后输出ans。
因此F数组的含义为:F[i]为0表示第i个人还在,F[i]为1表示第i个人已经离开。

11     int i = 0, p = 0, c = 0;
12     while(__(1)__) {
13         if(F[i] == 0) {
14             if(__(2)__) {
15                 F[i] = 1;
16                 ___(3)___;
17             }
18             ___(4)___
19         }
20         ___(5)___;
21     }	

接下来看核心的一段,都是空,基本相当于需要我们自己写。而选择题的选项其实也能给我们提供提示。
第(1)空要填的是while循环进行的条件,先向下看。
如果F[i]为0,也就是i还在,那么接下来就该考虑第i人是否数到1,如果数到1就该离开。
所以第(2)空应该填的意义为:第i人是否数到1。
满足该条件,F[i]设为1,也就是第i人离开。而后做的事情填在第(3)空。
每当一人离开,应该做一次计数,离开的人数达到n-1个就应该结束了。结合第(1)空的选项,可以看出c表示离开的人数。第(1)空应该填c < n-1,选D。第(3)空应该填c++,选C。
无论第i人是否数到1,都要做的事情填在第(4)空。
判断当前数1还是数0的变量应该是p(就剩下p变量没有用了),p为1表示应该数1,p为0表示应该数0。因此第(2)空应该填p为1,作为判断条件,p为1、p为真、或只写p的效果是一样的。所以选C。第(4)空为p的变化,p应该是如果是0就变1,如果是1就变0,p ^= 1操作可以实现这一点,选D。
无论F[i]是否为0,都做的事情填在第(5)空。
i是F数组的下标,应该对F数组进行循环遍历,直到只有一个元素还在,i遍历到n-1时,i的下一个位置是0,因此第(5)空应该填i的变化方式,即i = (i+1)%n,选B。

【答案】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值