#超人计划# 关于天梯赛第3层的题解
2025-11-02 21:21:33
发布于:重庆
前言
呃呃呃,算是我再退站前做的一次贡献吧,如果能不靠d就上榜的话,我直接永不退站(


827人被卡在第3层了,看他们挺可怜的就发了这个神秘的帖子,希望那些过了第3层的甜菜们别攻击我,也希望没过第3层的少年们看到我这个帖子后明白思路并过的给我点点赞、评论支持一下。为了大家的观感更佳,所以我用Deepseek完善了一下思路和总结了一些东西,不过伪代码和代码这些都是作者现写的,应该不算是AI帖子吧
,最后感谢支持啦
~
正文
代码放最后了(
从 0 数到n的总进位次数
从 0 到 n 的加法过程,就是模拟一个十进制计数器从 0 到 n 的过程。每次加 1 时,从最低位开始,如果某一位变成 0,就表示这一位发生了进位,然后继续处理更高位。所以我们可以直接统计每一位在从 0 到 n 的过程中一共进位了多少次。
伪代码:
开始
读取 n
初始化 进位次数 = 0
初始化 基数 = 10
循环 当 基数 <= n * 10
进位次数 = 进位次数 + n
基数 = 基数 * 10
输出 进位次数
结束
稳定段统计
这是第 3 层可以说是最难(?)的一道题,估计大部分同学都被卡在这里了(
总结题目就是统计数组中所有满足“相邻元素差 ≤ k”的连续子段的数量,找出最长子段的长度。
稳定段的边界:当 | a[i] - a[i-1] | > k 时,这里就是两个稳定段的分界点。
单个元素:总是稳定的,所以至少有一个稳定段
连续扩展:只要相邻元素差 ≤ k,就可以继续扩展当前稳定段
最后注意更新最后一段的最大长度。
伪代码:
开始
读取 n, k
读取数组 a
段数 = 1
当前段长度 = 1
最大段长度 = 1
循环 i 从 1 到 n-1:
如果 |a[i] - a[i-1]| <= k:
当前段可以扩展,长度+1
否则
遇到分界点,段数+1
更新最大长度
重置当前段长度为1
如果 当前段长度 > 最大段长度
更新最大段长度
输出 段数, 最大段长度
结束
奇妙的数字变化
题目要的是变化次数最多,不是最终数字最大。所以变化次数 = 从初始到结束,值发生改变的次数。说人话其实就可以理解为找非 0 的自然数有几个就行了,最终的时间复杂度为 O(n),空间复杂度为 O(1),非常完美,我认为这是第 3 层最简单的一题了。
伪代码:
开始
读取 n
初始化 sum = 0
循环 i 从 1 到 n:
输入 a[i]
如果 a[i] 不等于 0:
sum + 1
输出 sum
结束
应该这 3 道题思路已经很明确了,所以我们进入正题(((
代码部分,为了提升观感所以注释是AI写的,希望大家能更直观的看懂
从 0 数到n的总进位次数
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n,ans=0,a=10;
// n: 输入的数字,ans: 进位总次数
//a: 当前处理的位数(10,100,1000...)
cin>>n;
// 遍历每一位(个位、十位、百位...)
while(a<=n*10){ // 条件确保能处理到最高位(n*10是为了包含可能的最低位)
ans+=n/a; // 当前位产生的进位次数 = n除以当前位数的商
a*=10; // 移动到下一位(十位→百位→千位...)
}
cout<<ans; // 输出总进位次数
}
稳定段统计
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k,f,s;
// n: 数组长度
//k: 阈值
//f: 前一个数
//s: 当前数
cin>>n>>k>>f; // 先读取第一个数到f
int ans=1; // 稳定段的数量,至少有一个段
int l=1; // 当前段的长度
int mxl=1; // 最长稳定段的长度
for(int i=1;i<n;i++){
cin>>s; // 读取当前数
// 检查是否满足稳定条件
if(abs(s-f)<=k){
l++; // 满足条件,当前段长度+1
}
else{
ans++; // 不满足条件,段数+1
if(l>mxl){
mxl=l; // 更新最大长度
}
l=1; // 新段开始,长度重置为1
}
f=s; // 更新前一个数为当前数
}
// 循环结束后检查最后一段的长度
if(l>mxl){
mxl=l;
}
cout<<ans<<" "<<mxl; // 输出段数和最长段长度
}
奇妙的数字变化
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,sum=0;
// n: 数字个数
//sum: 统计非零数字个数
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(x!=0){
sum++; // 遇到非零数字就计数
}
}
cout<<sum; // 输出非零数字的个数
}
后记

作者亲测全部AC,因为天梯赛不能复制,所以每个代码作者都是自己手敲的,呃呃呃,给我点赞回回血吧!
之所以没选“创作计划”是因为作者怕被AC君老师干掉,不过如果AC君老师看见了这篇帖子并觉得蒟蒻我写的还可以的话也很希望评精转正啊,作者会很高兴~
作者真要脸 )
那我就随便@几个人吧 )))
不要随随便便打开不知名的链接(
@™
@༺དༀ༒∞░∞༒ༀཌ༻
@阿基米哲V(^-^)V
@4911730
@福粥永泰
@小潘同学(能打过橙子同学)
@只喜欢AC&人畜无害滴卡皮巴拉~
@™☯一合神星༻དༀ瞳ༀཌ༺
@༺ཌༀ༒RDS༒ༀད༻(必回关)
@༺ཌༀ我要上南开ༀད༻
@fth114514
@忘川秋库
@✨❎→张老帅
@漩涡鸣人
@霍格沃兹退站在逃分数杀手
@啊流流流
@(关回必)达仲_明孔_者仇复
@zhaosichen
@++c吧蛋滚
@复仇者_天之神_张起灵
@stars_waste
@Mars火星橙
@学神
@
@一架空客A350
写的太差了没敢@太多巨佬,emm应该没@多少人吧(
完结撒花~
本文作者在这篇文章里采用了生动形象的写作手法,突出了作者是乐子和蒟蒻的特点(
全部评论 16
我是慕温,走遍ACGO所有灌水贴(不喜可删)
13小时前 来自 浙江
1你连shazi都敢@啊?
13小时前 来自 广西
1怎么还@上我了?
13小时前 来自 广西
1顶顶顶
13小时前 来自 广西
1顶顶顶
13小时前 来自 广西
1顶顶顶
13小时前 来自 广西
1这真是一个好贴
13小时前 来自 浙江
1good
13小时前 来自 浙江
1还是没人看吗(

13小时前 来自 重庆
1有人
13小时前 来自 浙江
0
?@我干什么
48分钟前 来自 浙江
0本文作者在这篇文章里采用了生动形象的写作手法,突出了作者是乐子和蒟蒻的特点(
666,我也是服了13小时前 来自 广西
0虽然我已经过了,但是来凑凑热闹
13小时前 来自 广西
0%%%
13小时前 来自 浙江
0d
13小时前 来自 浙江
0太棒了
13小时前 来自 浙江
0喜欢ing
13小时前 来自 浙江
0





























有帮助,赞一个