2025 年 12 月青少年软编等考 C 语言一级真题解析
目录
- T1. 数数
- 思路分析
- T2. 分糖果
- 思路分析
- T3. 等差数列
- 思路分析
- T4. 灯塔
- 思路分析
- T5. 知识竞赛
- 思路分析
T1. 数数
题目链接:SOJ P2798
老师给小米布置了一个数数练习:“请数一数从数字A AA到数字B BB之间一共有多少个整数(包括A AA和B BB)。”
同时老师提醒说,如果A AA比B BB大,那就一个数都没有,直接回答0 00。
时间限制:1 s
内存限制:256 MB
- 输入
第一行:两个整数A B A BAB,1 ≤ A , B ≤ 100 1≤A,B≤1001≤A,B≤100。 - 输出
输出满足条件的个数。 - 样例输入 1
5 7 - 样例输出 1
3 - 样例输入 2
11 10 - 样例输出 2
0 - 样例输入 3
20 30 - 样例输出 3
11
思路分析
此题考查分支结构,属于入门题。
当a > b a > ba>b时输出0 00,否则输出b − a + 1 b - a + 1b−a+1即为答案。
/* * Name: T1.cpp * Problem: 数数 * Author: Teacher Gao. * Date&Time: 2026/01/08 02:07 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);inta,b;cin>>a>>b;if(a>b){cout<<0<<endl;}else{cout<<b-a+1<<endl;}return0;}T2. 分糖果
题目链接:SOJ D1422
有三包糖果,分别有A AA、B BB、C CC颗。想把这三包糖果分成两组或三组,并且每组糖果的总数要一样多。糖果的包装不能拆开。请问能否做到?
时间限制:1 s
内存限制:256 MB
- 输入
第一行:三个整数A AA、B BB、C CC,用空格隔开,1 ≤ A , B , C ≤ 1000 1≤A,B,C ≤10001≤A,B,C≤1000。 - 输出
如果可以按要求分成若干组,输出Yes,否则输出No。 - 样例输入 1
2 6 4 - 样例输出 1
Yes - 样例输入 2
6 6 6 - 样例输出 2
Yes - 样例输入 3
1 3 5 - 样例输出 3
No
思路分析
此题考查分支机构的应用,属于基础题。
可以分成三组的条件是三包糖果数量一致,可以分成两组的条件是数量最多的一包糖果的数量等于其余两包之和。因此需要找出三个数中的最大值,可以利用打擂台思想,与 2025 年 9 月一级第四题类似。
/* * Name: T2.cpp * Problem: 分糖果 * Author: Teacher Gao. * Date&Time: 2026/01/08 02:09 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);inta,b,c;cin>>a>>b>>c;if(b>a)swap(a,b);if(c>a)swap(a,c);if(a==b+c){// 可以分成两组cout<<"Yes\n";}elseif(a==b&&b==c){// 可以分成三组cout<<"Yes\n";}else{cout<<"No\n";}return0;}T3. 等差数列
题目链接:SOJ P7787
给定整数A AA,B BB。请求出有多少个整数x xx满足将A AA,B BB,x xx这三个整数以某种顺序排列,使其构成一个等差数列。
这里,若将三个整数p pp,q qq,r rr按此顺序排列后,若q − p q-pq−p等于r − q r-qr−q,则称其为等差数列。
时间限制:1 s
内存限制:256 MB
- 输入
两个整数A , B A,BA,B,1 ≤ A , B ≤ 100 1≤A,B≤1001≤A,B≤100。 - 输出
请输出满足题目条件的整数x xx的个数。 - 样例输入 1
5 5 - 样例输出 1
1 - 样例输入 2
4 6 - 样例输出 2
3 - 样例输入 3
18 11 - 样例输出 3
2
思路分析
此题考查分支结构与数学,属于基础题。
对于给定的两个整数a , b a,ba,b,要想新增一个整数x xx使得它们构成等差数列,x xx的可选位置最多只有3 33个,不失一般性地,假设a ≥ b a\ge ba≥b,
- 当a = b a = ba=b时,公差必定为0 00,于是x xx只有1 11种可能,那就是继续与a , b a,ba,b重叠;
- 当a − b a - ba−b为奇数时,说明无法在a , b a,ba,b之间添加一个整数x xx,使得x xx到a aa和b bb的距离相等,那么x xx只能放在a aa和b bb之外,有2 22种方案;
- 当a − b a - ba−b为偶数时,说明可以在a , b a,ba,b之间添加一个整数x xx,使得x xx到a aa和b bb的距离相等,从而构成等差数列,再加上a aa和b bb之外的两种情况,总共3 33种情况。
/* * Name: T3.cpp * Problem: 等差数列 * Author: Teacher Gao. * Date&Time: 2026/01/08 02:21 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);inta,b;cin>>a>>b;if(a<b)swap(a,b);if(a==b){cout<<"1\n";}elseif((a-b)%2==1){cout<<"2\n";}else{cout<<"3\n";}return0;}T4. 灯塔
题目链接:SOJ P7788
港口灯塔会在每天的A AA点钟发射一次重要的安全信号。
你是一名水手,作息非常规律:B BB点整入睡,C CC点整醒来,且睡眠时间不会超过24 2424小时。只有在清醒时你才能正确接收灯塔信号,睡着时无法接收。请判断你是否每天都能接收到灯塔的安全信号。
时间限制:1 s
内存限制:256 MB
- 输入
三个整数A , B , C A,B,CA,B,C,0 ≤ A , B , C < 24 0≤A,B,C<240≤A,B,C<24,A AA,B BB和C CC各不相同。 - 输出
如果你每天都能接收到信号,则输出Yes;否则输出No。 - 样例输入 1
12 13 11 - 样例输出 1
Yes - 样例输入 2
16 20 22 - 样例输出 2
Yes - 样例输入 3
10 8 6 - 样例输出 3
No
思路分析
此题考查分支结构,属于基础题,与 [ABC228A] On and Off 思路一致,问题背景刚好相反。
由于睡眠时间不会超过24 2424小时,因此
- 如果b < c b < cb<c,说明睡眠时间是同一天,那么当a aa介于b ∼ c b\sim cb∼c之间时无法接收到灯塔信号;
- 如果b > c b > cb>c,说明睡眠时间跨越到了第二天,那么当a aa介于c ∼ b c\sim bc∼b之间时可以接收到灯塔信号。
/* * Name: T4_1.cpp * Problem: 灯塔 * Author: Teacher Gao. * Date&Time: 2026/01/08 02:33 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);inta,b,c;cin>>a>>b>>c;if(b<c){if(b<a&&a<c){cout<<"No\n";}else{cout<<"Yes\n";}}else{if(c<a&&a<b){cout<<"Yes\n";}else{cout<<"No\n";}}return0;}更进一步地,可以用c = c − b c=c-bc=c−b计算出每天睡眠的时长c cc,用a = a − b a=a-ba=a−b计算出目标时间点距离开始睡眠时间点的时间差a aa。由于时间可能会跨越两天,因此两个时间差都有可能是负数,可以给时间差加上 24 之后再对 24 取余来保证时间差都是非负的。接下来只需要检测目标时间点距离开始睡眠时间点的时间差a aa是否大于睡眠时长c cc即可。
/* * Name: T4_2.cpp * Problem: 灯塔 * Author: Teacher Gao. * Date&Time: 2026/01/17 00:17 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);inta,b,c;cin>>a>>b>>c;c=(c-b+24)%24;a=(a-b+24)%24;if(a>c){cout<<"Yes\n";}else{cout<<"No\n";}return0;}T5. 知识竞赛
题目链接:SOJ P4031
一场知识竞赛共有3 33道题目,分值分别是1 11分、2 22分和4 44分。
小蓝、小橙和小绿三人参加了比赛。小蓝获得A AA分,小橙获得B BB分。
小绿能答出小蓝和小橙中至少有一人答对的题目,但无法答出两人都答不出的题目。请求出小绿的得分。
在本题条件下,保证小绿的得分是唯一确定的。
时间限制:1 s
内存限制:256 MB
- 输入
一行,两个整数A AA和B BB,用空格隔开,0 ≤ A , B ≤ 7 0≤A,B≤70≤A,B≤7。 - 输出
一个整数,表示小绿的得分。 - 样例输入 1
1 2 - 样例输出 1
3 - 样例输入 2
0 0 - 样例输出 2
0
思路分析
此题考查位运算,属于基础题。
如果使用分支结构进行分类讨论,情况过于复杂繁琐。注意到3 33道题的得分刚好对应二进制下3 33个不同的位权,根据题意小绿可以答出小蓝和小橙至少一人答出的题目,因此把a aa和b bb按位或运算之后即可得到小绿的得分。
/* * Name: T5.cpp * Problem: 知识竞赛 * Author: Teacher Gao. * Date&Time: 2026/01/08 02:47 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);inta,b;cin>>a>>b;cout<<(a|b)<<endl;return0;}