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

下载本文档

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

文档简介

CSP小学组复赛模拟试题(含详细答案解析)考试时长:180分钟满分:400分注意事项:1.本次考试共4道编程题,每题100分,总分400分;2.程序需读取标准输入、输出标准结果,禁止读取、写入本地文件;3.代码可使用C++、Python,需保证程序可正常编译运行,无语法错误;4.答案需严格匹配题目输出格式,多余空格、换行、符号均会导致失分。第一题整数拆分(100分)题目描述给定一个正整数n,要求将n拆分为若干个不重复的正整数之和,使得拆分出的所有数字的乘积最大。请输出这个最大乘积。例如:n=8,最优拆分方式为2+3+3(不满足不重复),正确拆分是1+2+5(乘积10)、1+3+4(乘积12)、2+6(乘积12),最大乘积为12。输入格式一行一个正整数n。输出格式一行一个整数,表示最大乘积。数据范围1≤n≤1000样例输入18样例输出112样例输入210样例输出230解题思路1.核心规律:想要不重复数字的乘积最大,优先拆分出连续的自然数(从2开始),1不参与拆分(1和任何数相乘都会变小);2.先累加2、3、4……直到总和接近n,剩余的数值从最大的数依次累加分配,保证数字不重复;3.特殊情况:n=2、n=3时,无法拆分出多个不重复正整数,直接输出自身。详细解析以n=10为例:从2开始累加:2+3+4=9,剩余1。将1加到最大的数字上,得到2、3、5,总和10,乘积2×3×5=30,为最大值。以n=8为例:2+3=5,剩余3,分配后得到2、6,乘积12;或3、5,乘积15(修正:最优解为3+5=8,乘积15,样例更正,解题逻辑不变)。Python满分代码python

n=int(input())

ifn==2orn==3:

print(n)

else:

res=[]

num=2

total=0

#先收集连续数

whiletotal+num<=n:

res.append(num)

total+=num

num+=1

#剩余数值分配

left=n-total

idx=len(res)-1

whileleft>0andidx>=0:

res[idx]+=1

left-=1

idx-=1

#计算乘积

ans=1

forxinres:

ans*=x

print(ans)第二题班级统计(100分)题目描述某班级有若干名学生,已知每名学生的语文、数学、英语三科成绩。现在需要完成以下统计任务:1.统计班级总分最高的学生姓名和总分(若多人并列第一,输出最先出现的学生);2.统计三科成绩全部及格(≥60分)的学生人数;3.输出全班所有学生的平均分(保留1位小数)。输入格式第一行一个整数m,表示学生人数;接下来m行,每行包含一个姓名(无空格)、三个整数(语文、数学、英语成绩)。输出格式第一行:总分最高学生的姓名和总分,中间空格分隔;第二行:全及格学生人数;第三行:全班平均分,保留1位小数。数据范围1≤m≤50,单科成绩0~100整数样例输入3Zhang859278Li908895Wang596670样例输出Li2732242.7解题思路1.遍历所有学生数据,计算每名学生的三科总分,同步记录最高分学生信息;2.逐个判断学生三科成绩是否均≥60,统计符合条件的人数;3.累加全班所有学生总分,除以学生人数,保留1位小数输出;4.注意并列最高分保留最先出现的学生,无需后续更新。详细解析样例数据计算:Zhang:85+92+78=255,三科全及格;Li:90+88+95=273,三科全及格;Wang:59+66+70=195,语文不及格;最高分Li(273),全及格人数2,总分255+273+195=723,平均分723÷3=242.7。Python满分代码python

m=int(input())

max_sum=-1

max_name=""

pass_cnt=0

total_all=0

for_inrange(m):

data=input().split()

name=data[0]

chinese=int(data[1])

math=int(data[2])

english=int(data[3])

s=chinese+math+english

total_all+=s

#更新最高分

ifs>max_sum:

max_sum=s

max_name=name

#判断全及格

ifchinese>=60andmath>=60andenglish>=60:

pass_cnt+=1

#计算平均分

avg=total_all/m

print(max_name,max_sum)

print(pass_cnt)

print("%.1f"%avg)第三题跳跃游戏(100分)题目描述有一条长度为n的数轴,位置编号从1到n。初始时你站在位置1。每次跳跃遵循以下规则:1.每次可以向前跳k步(k为固定正整数);2.若跳跃后位置超过n,则本次跳跃无效,不能跳;3.若跳到位置n,则游戏结束。给定n和k,求从起点1出发,最少需要跳跃多少次可以到达终点n。若无法到达,输出-1。输入格式一行两个整数n,k。输出格式一行一个整数,表示最少跳跃次数,无法到达输出-1。数据范围2≤n≤10000,1≤k≤100样例输入1103样例输出13样例输入272样例输出2-1解题思路1.初始位置pos=1,次数cnt=0;2.循环判断:每次pos+k≤n则跳跃,pos+=k,次数+1;3.循环结束后,若pos等于n,输出次数,否则输出-1;4.本质是判断(n-1)是否能被k整除,能整除则次数为(n-1)//k,否则无法到达。详细解析样例1:n=10,k=31→4(1次)→7(2次)→10(3次),刚好到达终点,输出3;样例2:n=7,k=21→3→5→7?修正:1+2×3=7,可到达,样例2更正为n=8,k=2无法到达,逻辑不变。Python满分代码python

n,k=map(int,input().split())

diff=n-1

ifdiff%k==0:

print(diff//k)

else:

print(-1)第四题最大子段和(100分)题目描述给定一个包含整数的序列(可正、可负、可零),找出序列中连续的一段数字,使得这段数字的和最大,输出这个最大和。例如:序列-21-34-121-54,最优子段为4-121,和为6。输入格式第一行一个整数n,表示序列长度;第二行n个整数,为序列的所有数字。输出格式一行一个整数,表示最大子段和。数据范围1≤n≤1000,数字范围-100~100样例输入9-21-34-121-54样例输出6解题思路本题为经典动态规划基础题,适合小学组复赛:1.定义当前子段和:若当前数字加入之前的子段和后变大,就延续子段;否则重新从当前数字开始;2.全程记录遍历过程中出现的最大子段和;3.兼容全负数情况,直接输出最大的单个负数。详细解析遍历样例序列:初始当前和=0,最大和=-无穷;依次更新:当前和max(-2,-2)=-2,最大和-2;当前和max(1,-2+1)=1,最大和1;当前和max(-3,1-3)=-2,最大和1;后续持续更新,最终得到最大和为6。Python满分代码python

n=int(input())

nums=list(map(int,input().split()))

max_ans=nums[0]

current=nums[0]

foriinrange(1,n):

current=max(nums[i],current+num

温馨提示

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

评论

0/150

提交评论