暑假恢复训练(A)题目解析
2026-08-14 19:37:44
发布于:广东
第六题:金币
题意理解
金币发放规律是分组的:
第1组:1天,每天1枚
第2组:2天,每天2枚
第3组:3天,每天3枚
第4组:4天,每天4枚
...
题目给出 k,表示一共发放前 k 天,要求总共获得多少金币。
例子理解
如果 k=6:
第1天:1
第2天:2
第3天:2
第4天:3
第5天:3
第6天:3
总和是:
1+2+2+3+3+3=14
解题思路
用三个变量:
day:已经统计了多少天;num:当前每天发多少金币;ans:总金币数。
从 num=1 开始。
当前组要连续发 num 天,每天发 num 枚金币。
但是如果剩余天数不够,就只能发到第 k 天为止。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int k;
cin>>k;
int day=0;
int num=1;
int ans=0;
while(day<k){
for(int i=1;i<=num&&day<k;i++){
ans+=num;
day++;
}
num++;
}
cout<<ans<<"\n";
return 0;
}
易错点
- 每组持续的天数等于金币数。
比如每天发 3 枚时,要连续发 3 天。
- 最后一组可能发不满。
所以内层循环要加 day<k。
- 不要把
num和day混在一起。
第七题:数组虽好,可不能乱开哦
题意理解
题目有多组数据。
每组给:
n:数组长度;k:要查询的下标;- 接下来有
n个数。
如果 1<=k<=n,输出第 k 个数。
否则输出 -1。
关键提醒
题目标题说“数组虽好,可不能乱开哦”,说明不能随便开很大的数组。
因为 n 最大可能到 10^7,如果每组都开巨大数组,很容易浪费内存。
其实我们只需要第 k 个数,不需要保存整个数组。
解题思路
对于每组数据:
- 读入
n,k。 - 循环读入
n个数。 - 如果当前读到的是第
k个,就记录下来。 - 读完后判断
k是否合法。 - 合法输出记录的值,否则输出
-1。
为什么 k 不合法也要读完数组
因为输入数据是连续的。
如果这一组的数组没有读完,下一组的 n,k 就会读错位置。
所以无论 k 是否合法,都必须把这组的 n 个数读完。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
long long n,k;
cin>>n>>k;
long long ans=-1;
for(long long i=1;i<=n;i++){
long long x;
cin>>x;
if(i==k){
ans=x;
}
}
if(k>=1&&k<=n){
cout<<ans<<"\n";
}
else{
cout<<-1<<"\n";
}
}
return 0;
}
易错点
k=0时要输出-1。k>n时要输出-1。- 即使答案是
-1,也要读完整组数组。 - 数组元素可能很大,要用
long long。
第八题:陶陶摘苹果
题意理解
有 10 个苹果,每个苹果有一个高度。
陶陶自己能伸手达到高度 h。
她还能踩一个 30 厘米的板凳。
所以她实际能碰到的最大高度是:
h+30
题目问 10 个苹果中,有多少个高度不超过 h+30。
解题思路
先读入 10 个苹果的高度。
再读入陶陶伸手高度 h。
然后逐个判断:
if(a[i]<=h+30)
如果成立,说明能摘到,答案加 1。
为什么是 <=
题目说“碰到苹果,苹果就会掉下来”。
如果苹果高度刚好等于陶陶能达到的高度,也算能摘到。
所以判断条件是 <=,不是 <。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[15];
for(int i=1;i<=10;i++){
cin>>a[i];
}
int h;
cin>>h;
int ans=0;
for(int i=1;i<=10;i++){
if(a[i]<=h+30){
ans++;
}
}
cout<<ans<<"\n";
return 0;
}
易错点
- 忘记加板凳高度
30。 - 判断写成
<。 - 苹果固定有 10 个,不需要读入
n。
第十一题:质数口袋
题意理解
从 2 开始依次判断每个自然数是不是质数。
如果是质数,就尝试放入口袋。
口袋里的数字总和不能超过 L。
要求:
- 按从小到大的顺序输出能装进去的质数;
- 最后输出一共装了几个质数。
什么是质数
质数是指大于 1,并且除了 1 和它本身以外,没有其他约数的数。
例如:
2,3,5,7,11
都是质数。
1 不是质数。
判断质数的方法
判断 x 是否为质数:
从 2 枚举到 sqrt(x)。
如果存在某个数能整除 x,说明不是质数。
否则就是质数。
为什么只枚举到 sqrt(x)?
如果 x 有一个大于 sqrt(x) 的因子,那么一定还有一个小于 sqrt(x) 的因子和它相乘得到 x。
所以前面没找到,后面也不用找。
解题步骤
- 读入
L。 - 从
i=2开始枚举。 - 如果
i是质数,并且sum+i<=L:- 输出
i; sum+=i;cnt++。
- 输出
- 如果再加入会超过
L,停止。 - 输出
cnt。
参考代码
#include<bits/stdc++.h>
using namespace std;
int isprime(int x){
if(x<2)return 0;
for(int i=2;i*i<=x;i++){
if(x%i==0)return 0;
}
return 1;
}
int main(){
int L;
cin>>L;
int sum=0;
int cnt=0;
for(int i=2;;i++){
if(isprime(i)){
if(sum+i>L)break;
cout<<i<<"\n";
sum+=i;
cnt++;
}
}
cout<<cnt<<"\n";
return 0;
}
易错点
1不是质数。- 加入质数前要先判断会不会超过
L。 - 最后还要输出质数个数。
- 输出是每个数字占一行。
这里空空如也













有帮助,赞一个