
目录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^51≤n≤105第二行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^51≤ai≤105。输出一个整数数列中含有多少个不同的整数。样例输入 16 1 6 5 6 3 1样例输出 14样例输入 210 1 2 3 4 5 6 7 8 9 10样例输出 210思路分析此题考察数组的使用属于基础题。由于数列元素a i a_iai不超过10 5 10^5105因此可以定义一个数组标记每个元素是否出现过如果输入的元素没有出现过则累计一次不相同元素的数量然后将该元素标记为已出现最后输出计数器的值即可。/* * Name: T1.cpp * Problem: 不同的数字 * Author: Teacher Gao. * DateTime: 2026/01/17 15:48 */#includeiostreamusingnamespacestd;intn,x,tot;boolf[100005];intmain(){ios::sync_with_stdio(false),cin.tie(0);cinn;for(inti1;in;i){cinx;if(!f[x])tot;f[x]1;}couttotendl;return0;}T2. 丢失的数字题目链接SOJ D1436给定整数n nn个一个包含n − 1 n-1n−1个整数的序列该序列由区间[ 1 , n ] [1,n][1,n]内的n − 1 n-1n−1个互异整数组成。请找出该区间内缺失的唯一整数。时间限制1 s内存限制256 MB输入第一行一个整数n nn1 ≤ n ≤ 2 × 10 4 1\le n\le 2\times 10^41≤n≤2×104第二行n − 1 n-1n−1个整数输入序列保证合法。输出一个整数表示丢失的数字。样例输入 16 1 2 5 6 3样例输出 14样例输入 210 7 2 3 9 4 8 1 6 10样例输出 25思路分析此题考察循环结构属于基础题。与第一题类似可以使用一个数组标记每个出现的数字最后从1 ∼ n 1\sim n1∼n寻找没有被标记的数字输出即可。更简单的方法是利用输入数据的特征如果没有缺失数字那么1 ∼ n 1\sim n1∼n的总和是n ( n 1 ) 2 \frac{n(n1)}{2}2n(n1)我们可以对输入序列求和然后用1 ∼ n 1\sim n1∼n的总和减去序列总和即可。/* * Name: T2.cpp * Problem: 丢失的数字 * Author: Teacher Gao. * DateTime: 2026/01/17 15:56 */#includeiostreamusingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);intn,x,sum0;cinn;for(inti1;in;i){cinx;sumx;}coutn*(n1)/2-sumendl;return0;}T3. 维修任务题目链接SOJ D1437在一条商业街上有100 100100个店铺店铺从左到右编号为1 11到100 100100。工人从店铺x xx移动到y yy发生的移动距离为∣ y − x ∣ |y-x|∣y−x∣。现在需要完成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 1001≤n≤100接下来n nn行每行一个整数a i a_iai表示商店位置一个字符s i s_isi表示哪位工人完成1 ≤ a i ≤ 100 1\le a_i\le 1001≤ai≤100s i ∈ { s_i\in\{si∈{LR} \}}。输出输出所有任务完成时的最小总距离。样例输入 14 3 L 6 R 9 L 2 R样例输出 110样例输入 23 2 L 2 L 99 L样例输出 297样例输入 38 22 L 75 L 26 R 45 R 72 R 81 R 47 L 29 L样例输出 3154思路分析此题考察循环结构属于基础题。任务分配的工人不同就需要不同的工人进行移动因此需要两个变量分别记录两个工人的当前位置。由于必须按照任务的输入顺序来完成因此根据任务分配的工人进行相应移动距离的求解即可不存在移动距离更小的操作空间。唯一可以减少移动距离的地方就是两个工人的初始位置可以直接设置成分配给他们的第一个任务的位置这样一来第一次任务的移动距离就是0 00。/* * Name: T3.cpp * Problem: 维修任务 * Author: Teacher Gao. * DateTime: 2026/01/17 16:04 */#includeiostream#includecmathusingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);intn,x,L0,R0,tot0;chary;cinn;for(inti1;in;i){cinxy;if(yL){if(L)totabs(L-x);Lx;}else{if(R)totabs(R-x);Rx;}}couttotendl;return0;}T4. 硬币题目链接SOJ D1438可以使用任意数量的a aa元硬币、b bb元硬币和c cc元硬币。请找出恰好凑出n nn元所需的最小硬币总数。若无法凑出则输出− 1 -1−1。时间限制1 s内存限制64 MB输入第一行整数n nn1 ≤ n ≤ 10 9 1\le n\le 10^91≤n≤109第二行三个整数表示a , b , c a,b,ca,b,c1 ≤ a ≤ b ≤ c ≤ 10 9 1\le a\le b\le c\le 10^91≤a≤b≤c≤109。输出输出最小硬币总数若无法凑出则输出− 1 -1−1保证答案不超过10 4 10^4104。样例输入 1100 20 40 50样例输出 12样例输入 299 1 5 10样例输出 214思路分析此题考察枚举算法属于基础题。为了减少枚举的次数先枚举面值最大的c cc元硬币再枚举面值第二大的b bb元硬币然后计算出剩余面额满足非负且是a aa的倍数即可在枚举过程中计算出所需硬币数量最小值。/* * Name: T4.cpp * Problem: 硬币 * Author: Teacher Gao. * DateTime: 2026/01/17 17:17 */#includeiostreamusingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);intn,a,b,c,ans100000;cinnabc;// 先枚举面值最大的 c 元硬币最多 10000 个for(intimin(n/c,10000);i0;i--){// 再枚举面值第二大的 b 元硬币最多 10000 - i 个for(intjmin((n-i*c)/b,10000-i);j0;j--){// 计算出剩余面额 x必须是 a 的倍数intxn-i*c-j*b;if(0xx%a0){ansmin(ans,ijx/a);}}}if(ans100000)coutansendl;elsecout-1endl;return0;}T5. 游戏题目链接SOJ D1439游戏中有n nn个敌人第i ii个敌人有h i h_ihi的血量当敌人血量降至0 00或以下时该敌人被消灭。按照顺序从第1 11个敌人开始打时间t tt从0 00开始每次攻击前先将t tt增加1 11若此时t tt为3 33的倍数当前敌人掉3 33滴血否则掉1 11滴血。求消灭全部敌人所需时间。时间限制1 s内存限制256 MB输入第一行输入一个正整数n nn1 ≤ n ≤ 2 × 10 5 1\le n\le 2\times 10^51≤n≤2×105第二行输入n nn个正整数h i h_ihi1 ≤ h i ≤ 10 9 1\le h_i\le 10^91≤hi≤109。输出输出一行答案。样例输入 13 3 1 4样例输出 16样例输入 26 3 14 15 9 2 6样例输出 233思路分析此题考察循环结构与数学属于基础题。由于消灭敌人的时间是累计的因此在使用数学方式计算每个敌人的消灭时间之前应该使用模拟法先把当前时间对齐到3 33的倍数。之后每3 33个时刻消耗5 55点血量将敌人的血量每5 55点作为一组可以使用数学方式立即计算出完整的组数对于剩余的血量继续使用模拟法即可。/* * Name: T5.cpp * Problem: 游戏 * Author: Teacher Gao. * DateTime: 2026/01/21 11:58 */#includeiostreamusingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(0);intn,x;longlongt0;cinn;for(inti1;in;i){cinx;while(x0){t;if(t%3)x--;else{// 时间对齐到 3 的倍数并消耗掉当前时刻的血量x-3;// 从下一时刻开始计算每 3 个时间消耗 5 点血量intpx/5;tp*3;x-p*5;}}}couttendl;return0;}