2025 年 9 月青少年软编等考 C 语言二级真题解析
2026/8/31 5:37:35 网站建设 项目流程

目录

  • T1. 不同的数字
    • 思路分析
  • T2. 丢失的数字
    • 思路分析
  • T3. 维修任务
    • 思路分析
  • T4. 硬币
    • 思路分析
  • T5. 游戏
    • 思路分析

T1. 不同的数字

题目链接:SOJ D1435

给定n nn个正整数a 1 , a 2 , . . . , a n a_1,a_2,...,a_na1,a2,...,an,请统计出这个数列中含有多少个不同的整数。

时间限制:1 s
内存限制:256 MB

  • 输入
    第一行一个整数n nn1 ≤ n ≤ 10 5 1\le n\le 10^51n105
    第二行n nn个整数a 1 , a 2 , . . . , a n a_1,a_2,...,a_na1,a2,...,an1 ≤ a i ≤ 10 5 1\le a_i\le 10^51ai105
  • 输出
    一个整数,数列中含有多少个不同的整数。
  • 样例输入 1
    6 1 6 5 6 3 1
  • 样例输出 1
    4
  • 样例输入 2
    10 1 2 3 4 5 6 7 8 9 10
  • 样例输出 2
    10

思路分析

此题考察数组的使用,属于基础题。

由于数列元素a i a_iai不超过10 5 10^5105,因此可以定义一个数组标记每个元素是否出现过,如果输入的元素没有出现过,则累计一次不相同元素的数量,然后将该元素标记为已出现,最后输出计数器的值即可。

/* * Name: T1.cpp * Problem: 不同的数字 * Author: Teacher Gao. * Date&Time: 2026/01/17 15:48 */#include<iostream>usingnamespacestd;intn,x,tot;boolf[100005];intmain(){ios::sync_with_stdio(false),cin.tie(0);cin>>n;for(inti=1;i<=n;i++){cin>>x;if(!f[x])tot++;f[x]=1;}cout<<tot<<endl;return0;}

T2. 丢失的数字

题目链接:SOJ D1436

给定整数n nn个一个包含n − 1 n-1n1个整数的序列,该序列由区间[ 1 , n ] [1,n][1,n]内的n − 1 n-1n1个互异整数组成。请找出该区间内缺失的唯一整数。

时间限制:1 s
内存限制:256 MB

  • 输入
    第一行一个整数n nn1 ≤ n ≤ 2 × 10 4 1\le n\le 2\times 10^41n2×104
    第二行n − 1 n-1n1个整数,输入序列保证合法。
  • 输出
    一个整数,表示丢失的数字。
  • 样例输入 1
    6 1 2 5 6 3
  • 样例输出 1
    4
  • 样例输入 2
    10 7 2 3 9 4 8 1 6 10
  • 样例输出 2
    5

思路分析

此题考察循环结构,属于基础题。

与第一题类似,可以使用一个数组标记每个出现的数字,最后从1 ∼ n 1\sim n1n寻找没有被标记的数字输出即可。

更简单的方法是利用输入数据的特征,如果没有缺失数字,那么1 ∼ n 1\sim n1n的总和是n ( n + 1 ) 2 \frac{n(n+1)}{2}2n(n+1),我们可以对输入序列求和,然后用1 ∼ n 1\sim n1n的总和减去序列总和即可。

/* * Name: T2.cpp * Problem: 丢失的数字 * Author: Teacher Gao. * Date&Time: 2026/01/17 15:56 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);intn,x,sum=0;cin>>n;for(inti=1;i<n;i++){cin>>x;sum+=x;}cout<<n*(n+1)/2-sum<<endl;return0;}

T3. 维修任务

题目链接:SOJ D1437

在一条商业街上,有100 100100个店铺,店铺从左到右编号为1 11100 100100。工人从店铺x xx移动到y yy发生的移动距离为∣ y − x ∣ |y-x|yx

现在需要完成n nn个修理任务。其中第i ii个任务要求工人移动到店铺a i a_iai,报修任务分两类,用L LL表示任务分配给小李,用R RR表示任务分配给小任。

必须按照报修的顺序来完成这些任务。请计算,完成所有修理任务后,两位工人的总移动距离。工人最开始的位置可以按照最理想的情况安排。

时间限制:1 s
内存限制:256 MB

  • 输入
    第一行一个整数n nn表示搬运次数,1 ≤ n ≤ 100 1\le n\le 1001n100
    接下来n nn行,每行一个整数a i a_iai表示商店位置,一个字符s i s_isi表示哪位工人完成,1 ≤ a i ≤ 100 1\le a_i\le 1001ai100s i ∈ { s_i\in\{si{'L''R'} \}}
  • 输出
    输出所有任务完成时的最小总距离。
  • 样例输入 1
    4 3 L 6 R 9 L 2 R
  • 样例输出 1
    10
  • 样例输入 2
    3 2 L 2 L 99 L
  • 样例输出 2
    97
  • 样例输入 3
    8 22 L 75 L 26 R 45 R 72 R 81 R 47 L 29 L
  • 样例输出 3
    154

思路分析

此题考察循环结构,属于基础题。

任务分配的工人不同,就需要不同的工人进行移动,因此需要两个变量分别记录两个工人的当前位置。由于必须按照任务的输入顺序来完成,因此根据任务分配的工人进行相应移动距离的求解即可,不存在移动距离更小的操作空间。唯一可以减少移动距离的地方就是两个工人的初始位置,可以直接设置成分配给他们的第一个任务的位置,这样一来第一次任务的移动距离就是0 00

/* * Name: T3.cpp * Problem: 维修任务 * Author: Teacher Gao. * Date&Time: 2026/01/17 16:04 */#include<iostream>#include<cmath>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);intn,x,L=0,R=0,tot=0;chary;cin>>n;for(inti=1;i<=n;i++){cin>>x>>y;if(y=='L'){if(L)tot+=abs(L-x);L=x;}else{if(R)tot+=abs(R-x);R=x;}}cout<<tot<<endl;return0;}

T4. 硬币

题目链接:SOJ D1438

可以使用任意数量的a aa元硬币、b bb元硬币和c cc元硬币。请找出恰好凑出n nn元所需的最小硬币总数。若无法凑出,则输出− 1 -11

时间限制:1 s
内存限制:64 MB

  • 输入
    第一行,整数n nn1 ≤ n ≤ 10 9 1\le n\le 10^91n109
    第二行,三个整数表示a , b , c a,b,ca,b,c1 ≤ a ≤ b ≤ c ≤ 10 9 1\le a\le b\le c\le 10^91abc109
  • 输出
    输出最小硬币总数,若无法凑出则输出− 1 -11,保证答案不超过10 4 10^4104
  • 样例输入 1
    100 20 40 50
  • 样例输出 1
    2
  • 样例输入 2
    99 1 5 10
  • 样例输出 2
    14

思路分析

此题考察枚举算法,属于基础题。

为了减少枚举的次数,先枚举面值最大的c cc元硬币,再枚举面值第二大的b bb元硬币,然后计算出剩余面额,满足非负且是a aa的倍数即可,在枚举过程中计算出所需硬币数量最小值。

/* * Name: T4.cpp * Problem: 硬币 * Author: Teacher Gao. * Date&Time: 2026/01/17 17:17 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);intn,a,b,c,ans=100000;cin>>n>>a>>b>>c;// 先枚举面值最大的 c 元硬币,最多 10000 个for(inti=min(n/c,10000);i>=0;i--){// 再枚举面值第二大的 b 元硬币,最多 10000 - i 个for(intj=min((n-i*c)/b,10000-i);j>=0;j--){// 计算出剩余面额 x,必须是 a 的倍数intx=n-i*c-j*b;if(0<=x&&x%a==0){ans=min(ans,i+j+x/a);}}}if(ans<100000)cout<<ans<<endl;elsecout<<-1<<endl;return0;}

T5. 游戏

题目链接:SOJ D1439

游戏中有n nn个敌人,第i ii个敌人有h i h_ihi的血量,当敌人血量降至0 00或以下时该敌人被消灭。

按照顺序从第1 11个敌人开始打,时间t tt0 00开始,每次攻击前,先将t tt增加1 11,若此时t tt3 33的倍数,当前敌人掉3 33滴血,否则掉1 11滴血。

求消灭全部敌人所需时间。

时间限制:1 s
内存限制:256 MB

  • 输入
    第一行输入一个正整数n nn1 ≤ n ≤ 2 × 10 5 1\le n\le 2\times 10^51n2×105
    第二行输入n nn个正整数h i h_ihi1 ≤ h i ≤ 10 9 1\le h_i\le 10^91hi109
  • 输出
    输出一行答案。
  • 样例输入 1
    3 3 1 4
  • 样例输出 1
    6
  • 样例输入 2
    6 3 14 15 9 2 6
  • 样例输出 2
    33

思路分析

此题考察循环结构与数学,属于基础题。

由于消灭敌人的时间是累计的,因此在使用数学方式计算每个敌人的消灭时间之前,应该使用模拟法先把当前时间对齐到3 33的倍数。之后每3 33个时刻消耗5 55点血量,将敌人的血量每5 55点作为一组,可以使用数学方式立即计算出完整的组数,对于剩余的血量继续使用模拟法即可。

/* * Name: T5.cpp * Problem: 游戏 * Author: Teacher Gao. * Date&Time: 2026/01/21 11:58 */#include<iostream>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);intn,x;longlongt=0;cin>>n;for(inti=1;i<=n;i++){cin>>x;while(x>0){t++;if(t%3)x--;else{// 时间对齐到 3 的倍数,并消耗掉当前时刻的血量x-=3;// 从下一时刻开始计算:每 3 个时间消耗 5 点血量intp=x/5;t+=p*3;x-=p*5;}}}cout<<t<<endl;return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询