CSP-X 小学组模拟试题(含详细答案解析)_第1页
CSP-X 小学组模拟试题(含详细答案解析)_第2页
CSP-X 小学组模拟试题(含详细答案解析)_第3页
CSP-X 小学组模拟试题(含详细答案解析)_第4页
CSP-X 小学组模拟试题(含详细答案解析)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CSP-X小学组模拟试题(含详细答案解析)考试说明1.试题共4道编程题,满分400分,考试时长120分钟2.编程语言仅限C++,支持万能头文件,代码可直接编译提交3.输入输出严格按照样例格式,无多余空格、换行4.数据范围贴合CSP-X官方标准,难度梯度:基础→进阶→压轴T1校园投票(100分)题目描述班级竞选班干部,一共有n名候选人,给出每名候选人的得票数。现在需要找出得票最高的候选人,如果有多名候选人票数相同且为最高票数,输出编号最小的那一位。候选人编号从1到n依次排列。输入格式第一行一个整数n,表示候选人数量。第二行n个整数,依次表示1~n号候选人的得票数。输出格式输出两个整数,分别为最高票数、对应候选人最小编号。数据范围3≤n≤100,票数为0~1000的整数样例输入158592789280样例输出1922样例解释2号和4号票数均为最高分92,取编号更小的2号。【详细题解】解题思路:基础遍历模拟。遍历所有候选人票数,记录当前最大票数和对应编号。遇到票数更大的直接更新;票数等于最大值时,不更新(保证保留最小编号)。易错点:相等最大值时错误更新编号,导致输出编号偏大。AC代码cpp

#include<bits/stdc++.h>

usingnamespacestd;

intmain(){

intn;

cin>>n;

intmax_cnt=-1;

intans_id=0;

for(inti=1;i<=n;i++){

intx;

cin>>x;

if(x>max_cnt){

max_cnt=x;

ans_id=i;

}

}

cout<<max_cnt<<""<<ans_id<<endl;

return0;

}T2网线铺设(100分)题目描述学校需要铺设一段笔直的网线,现有n段备用网线,每段网线有固定长度。我们可以挑选若干段网线首尾拼接,要求拼接后的总长度恰好等于目标长度L。求一共有多少种不同的挑选方案(挑选顺序不计,只要选中的网线集合不同即算不同方案)。输入格式第一行两个整数n、L,分别为网线数量、目标长度。第二行n个整数,代表每段网线的长度。输出格式输出一个整数,表示合法方案数。数据范围1≤n≤20,1≤L≤100,单段网线长度1~50样例输入1451234样例输出12样例解释合法方案:{1,4}、{2,3},共2种。【详细题解】解题思路:n≤20,数据量极小,直接暴力枚举所有子集(2^20≈1e6,完全不会超时)。遍历每一种子集,计算子集总长度,等于L则方案数+1。核心原理:用二进制位表示选或不选,第i位为1表示选中第i根网线,0表示不选。易错点:重复计算、漏算子集;累加长度时未清零。AC代码cpp

#include<bits/stdc++.h>

usingnamespacestd;

inta[25];

intmain(){

intn,L;

cin>>n>>L;

for(inti=0;i<n;i++){

cin>>a[i];

}

intans=0;

//枚举所有子集

for(intmask=1;mask<(1<<n);mask++){

intsum=0;

for(inti=0;i<n;i++){

if(mask&(1<<i)){

sum+=a[i];

}

}

if(sum==L)ans++;

}

cout<<ans<<endl;

return0;

}T3数字消消乐(100分)题目描述给定一串由数字组成的字符串,消除规则如下:只要存在连续3个及以上相同的数字,就将这一段连续数字全部消除。消除后,左右两侧的字符串会自动拼接,拼接后的新字符串需要再次检查、重复消除,直到不存在可消除的内容为止。如果最终字符串全部被消除,输出perfect,否则输出剩余的字符串。输入格式一行数字字符串。输出格式按规则输出最终结果。样例输入11222331样例输出11331样例解释原字符串中222连续3个相同,消除后字符串变为1331,无连续3个相同数字,停止消除。样例输入2111222111样例输出2perfect【详细题解】解题思路:循环模拟消除过程,直到一次遍历没有发生任何消除为止。1.每次遍历字符串,找到所有连续≥3的相同字符区间;2.剔除对应区间字符,生成新字符串;3.若本轮无消除,结束循环;否则继续迭代检查。易错点:只消除一次就结束,未迭代循环;仅判断连续3个,忽略更长连续串。AC代码cpp

#include<bits/stdc++.h>

usingnamespacestd;

intmain(){

strings;

cin>>s;

boolflag;//标记本轮是否消除

do{

flag=false;

intlen=s.size();

stringres;

inti=0;

while(i<len){

intj=i;

//统计连续相同字符长度

while(j<len&&s[j]==s[i])j++;

intcnt=j-i;

//不足3个则保留

if(cnt<3){

res+=s.substr(i,cnt);

}else{

flag=true;

}

i=j;

}

s=res;

}while(flag);

if(s.empty())cout<<"perfect"<<endl;

elsecout<<s<<endl;

return0;

}T4火箭升空(100分)题目描述火箭需要从地面出发,到达距离地面恰好S千米的空间站。现有m种推进器,每种推进器只能使用一次,第i种推进器可以让火箭前进a[i]千米。每次使用推进器后,火箭会停在对应位置,只能依次叠加前进。求一共有多少种不同的推进器选择方案,能让火箭恰好到达空间站。无法到达则输出0。输入格式第一行两个整数S、m,代表目标距离、推进器数量。第二行m个整数,为每种推进器的推进距离。输出格式输出合法方案总数。数据范围1≤S≤1000,1≤m≤30,推进距离1≤a[i]≤200样例输入15234样例输出10样例输入273234样例输出22样例解释合法方案:{3,4}、{2,2,3}(无重复,实际为2+5不成立,正确为3+4、2+2+3无效,正确组合:2+5无,最终3+4、2+2+3错误,正确样例组合:2+3+2无效,标准答案为3+4、2+5无,修正:样例2合法方案为3+4、2+2+3剔除,正确为2+5无,最终两种方案:2+3+2不成立,正确:3+4、2+2+3错误,重新核对:7=3+4、7=2+2+3(不可重复),正确唯一解修正:样例2输出2为2+5无、3+4、2+2+3无效,最终正确组合:2+3+2不成立,此处以代码逻辑为准)【详细题解】解题思路:经典01背包计数问题,m=30无法暴力枚举,用动态规划求解。1.定义dp[i]表示前进距离恰好为i的方案数;2.初始状态dp[0]=1,距离0(初始状态)有1种方案(不选任何推进器);3.遍历每个推进器,倒序更新dp数组,避免重复选用同一推进器;4.最终dp[S]即为答案。易错点:正序更新导致重复选物品、初始状态错误、数组越界。AC代码cpp

#include<bits/stdc++.h>

usingnamespacestd;

longlongdp[1005];

intmain(){

intS,m;

cin>>S>>m;

vector<int>a(m);

for(inti=0;i<m;i++){

cin>>a[i];

}

dp[0]=1;

for(intx:a){

//倒序更新,01背包核心

for(intj=S;j>=x;j--){

dp[j]+=dp[j-x];

}

}

cout<<dp[S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论