2021年CSP-J初赛真题及答案解析(完善程序1)
第1题
(Josephus 问题)有 (n) 个人围成一个圈,依次标号 (0) 至 (n-1)。从 (0) 号开始,依次 (0, 1, 0, 1, \dots) 交替报数,报到 (1) 的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。
试补全模拟程序。
01#include<iostream>0203usingnamespacestd;0405constintMAXN=1000000;06intF[MAXN];0708intmain(){09intn;10cin>>n;11inti=0,p=0,c=0;12while(①){13if(F[i]==0){14if(②){15F[i]=1;16③;17}18④;19}20⑤;21}22intans=-1;23for(i=0;i<n;i++)24if(F[i]==0)25ans=i;26cout<<ans<<endl;27return0;28}① 处应填( )
A.i < n
B.c < n
C.i < n - 1
D.c < n - 1
② 处应填( )
A.i % 2 == 0
B.i % 2 == 1
C.p
D.!p
③ 处应填( )
A.i++
B.i = (i + 1) % n
C.c++
D.p ^= 1
④ 处应填( )
A.i++
B.i = (i + 1) % n
C.c++
D.p ^= 1
⑤ 处应填( )
A.i++
B.i = (i + 1) % n
C.c++
D.p ^= 1
正确答案
- ① 选D(
c < n - 1) - ② 选C(
p) - ③ 选C(
c++) - ④ 选D(
p ^= 1) - ⑤ 选B(
i = (i + 1) % n)
详细解析
变量含义:
F[i] == 0表示编号i的人还在圈中;F[i] == 1表示已离开。c记录已经离开的人数。p记录当前这个人应该报的数(只能是0或1),初始为0。i记录当前正在检查的人的编号。
逐空分析:
① 循环条件
游戏进行到圈中只剩下一个人时停止。总人数为n,已离开c人,剩下n - c人。当n - c > 1时继续循环,即c < n - 1,所以选D。② 判断是否离开
规则是报到1的人离开。当前人还在圈中(F[i] == 0已满足),此时判断他报的数p是否为1。若p为真(即1)则条件成立,所以填p,选C。③ 离开后的操作
当有人报到1并离开时,标记F[i] = 1,同时离开人数c必须增加 1,所以此处应写c++,选C。④ 报数交替
无论当前这个人是否离开,只要他还在圈中(F[i] == 0),处理完后报数要在0和1之间切换,为下一个人准备。用p ^= 1实现翻转,选D。⑤ 移动指针
处理完当前编号i后,需要移动到下一个人。因为是围成圈,编号循环递增,所以写i = (i + 1) % n,选B。
更多内容请关注专栏:信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转
2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
https://edu.csdn.net/course/detail/41081 点击跳转
3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:
GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转
GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}