GESP2025年9月认证C++三级真题与解析(编程题1(数组清零))

GESP2025年9月认证C++三级真题与解析(编程题1(数组清零))

一、先看原题:


二、题目解析


1、先不看代码,先讲故事 🧸

(1)🧸 故事背景

小 A 有一排 能量水晶,每一块水晶都有能量值:

[0, 2, 3, 4]

(2)他的目标只有一个:

👉 把所有水晶的能量变成 0

(3)但他不能随便减,必须按规定操作。


2、一次“合法操作”是怎样的?⚙️

每一轮操作,小 A 都要 严格做 3 件事


✅ 第 1 步:找“最强水晶”

  • 在数组里找 最大的数
  • 如果有多个一样大 👉 选下标最大的那个

📌 例如:

[0,2, 3, 4] → 最大是 4(下标 3)

✅ 第 2 步:找“最弱但还活着的水晶”

  • 所有不为 0 的数
  • 最小的那个

📌 例如:

[0, 2, 3, 4] → 最小非 0 是 2, 因为2是活着的。

✅ 第 3 步:做减法!

  • 用:
最大值 -= 最小非 0 值

📌 所以:

4 - 2 = 2

数组变成:

​​​​​​​[0,2, 3, 2]

👉 这算 1 次操作


 ✅ 第 4 步:一直重复,直到最后停止🛑

🔚 当数组里所有数都变成 0,就停!

[0,0, 0, 0]

题目保证:
👉 一定能在有限次内变成全 0


3、本题可用模拟算法🧠

(1)模拟算法基本步骤。

模拟算法:

初始化状态变量; for (时间或次数) { 根据规则改变状态; if (满足条件) { 修改状态; } } 输出结果;

(2) 本题三个核心步骤:


🌟 步骤 1:用 while 循环

👉 “只要还有非 0,就继续干!”
while (true) { // 找最大 // 如果最大是 0 → break }

🌟 步骤 2:每一轮都“扫一遍数组”

因为你要:

  • 找最大值
  • 找最小非 0

👉 所以每一轮都要用 for 把数组看一遍


🌟 步骤 3:操作次数要数清楚

cnt++; // 每成功减一次,就 +1

4、参考程序

 ✅代码1

#include <iostream> using namespace std; int main() { int n; cin >> n; int a[105]; for (int i = 1; i <= n; i++) { cin >> a[i]; } int cnt = 0; // 记录操作次数 while (true) { // ① 找最大值的下标(如果相同,取下标大的) int maxPos = 1; for (int i = 1; i <= n; i++) { if (a[i] >= a[maxPos]) { maxPos = i; } } // 如果最大值已经是 0,说明全清零了 if (a[maxPos] == 0) break; // ② 找最小的非 0 值 int minVal = a[maxPos]; for (int i = 1; i <= n; i++) { if (a[i] > 0 && a[i] < minVal) { minVal = a[i]; } } // ③ 做减法 a[maxPos] -= minVal; cnt++; // 操作次数 +1 } cout << cnt << endl; return 0; } 

 ✅代码2

#include <iostream> #include <algorithm> using namespace std; int main() { int n; cin >> n; int a[105]; for (int i = 0; i < n; i++) { cin >> a[i]; } int cnt = 0; // 操作次数 while (true) { // ① 排序 sort(a, a + n); // ② 如果最大值已经是 0,说明全清零 if (a[n - 1] == 0) break; // ③ 找最小的非 0 int minNonZero = 0; for (int i = 0; i < n; i++) { if (a[i] > 0) { minNonZero = a[i]; break; } } // ④ 用最大值减最小非 0 a[n - 1] -= minNonZero; // ⑤ 计数 cnt++; } cout << cnt << endl; return 0; } 

5、本题用到的知识点:

考点是否重要
数组遍历⭐⭐⭐
while 循环⭐⭐⭐
最大 / 最小查找⭐⭐⭐
规则理解能力⭐⭐⭐⭐
模拟能力⭐⭐⭐⭐


6、本题注意的 几 个关键问题 🧩


1️⃣ 每一步操作,是否和题目完全一致?

(1)常见错误 ❌

  • 一次改了多个元素
  • 偷偷合并了两次操作

 (2)  正确做法 ✅

  • 一次 while / for = 一次题目操作

📌 在这道题中:

a[maxPos] -= minVal; cnt++; 

 (3) ✔ 一步一步来


2️⃣ 操作顺序不能乱 ⚠️

先找谁?
再做什么?
最后判断什么?

顺序一错,结果就错。

例子 🌰

题目说:

找最大值再找最小非 0再减

❌ 先减再找
❌ 一起找


3️⃣ 循环什么时候结束,一定要想清楚 🛑

(1)  常见错误

  • 死循环
  • 少算一次
  • 多算一次

(2) 正确姿势

结束条件,一定来自“题目规则”

本题中:

if (a[maxPos] == 0) break; 

✔ 这是题目中的要求


Read more

【年终总结】从非科班无实习到准字节前端:我始终相信,开发之外的事,才是破局关键

【年终总结】从非科班无实习到准字节前端:我始终相信,开发之外的事,才是破局关键

目录 【年终总结】从非科班无实习到准字节前端:我始终相信,开发之外的事,才是破局关键 一、求其外,善其内 1、坚持出发点正确的博文写作 2、博文更新对我心态的淬炼 3、社区交流对我视野的启发 4、向外拓展,反哺内修 二、陷入前端则前端死,跳出前端则前端活 1、从不务正业到泛前端 2、从泛前端到大前端,从有形到无形 三、秋招多少事 四、结语         作者:watermelo37         ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“创作之星”特邀作者、火山KOL、支付宝合作作者,全平台博客昵称watermelo37。         一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。 --------------------------------------------------------------------- 温柔地对待温柔的人,包容的三观就是最大的温柔。

By Ne0inhk

Flutter 三方库 xpath_selector 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、精准的 HTML/XML 数据抓取与 Web 结构解析引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 xpath_selector 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、精准的 HTML/XML 数据抓取与 Web 结构解析引擎 在鸿蒙(OpenHarmony)系统的网络爬虫、自动化测试审计、或者是从复杂的第三方 Web 公告(HTML)中提取关键数据(如新闻标题、资产负债表)时,如何摆脱凌乱的正向正则(Regex),转而使用业界标准的 XPath 语法进行语义化选取?xpath_selector 为开发者提供了一套工业级的、基于 Dart 的 HTML/XML 结构化查询方案。本文将深入实战其在鸿蒙端数据治理中的应用。 前言 什么是 XPath Selector?

By Ne0inhk

Flutter 三方库 bones_ui 的鸿蒙化适配指南 - 打造直观、响应式的 Web 风格 UI 交互体验

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 bones_ui 的鸿蒙化适配指南 - 打造直观、响应式的 Web 风格 UI 交互体验 Flutter for OpenHarmony 开发者在构建具有 Web 质感的跨平台应用时,UI 框架的选择至关重要。本文将带大家深度调研 Dart 三方库 bones_ui 在鸿蒙系统上的适配方案,探索如何利用其直观的组件架构,加速鸿蒙桌面级应用的开发效率。 前言 在移动端和桌面端融合的今天,开发者往往希望一套代码能同时适配多种屏幕形态。bones_ui 原生为 Dart Web 打造,但在 Flutter for OpenHarmony 的大前端生态中,其简洁的 UI 组件设计思想对我们构建鸿蒙跨平台应用具有极大的参考价值。

By Ne0inhk
【数据结构-初阶】顺序表相关习题

【数据结构-初阶】顺序表相关习题

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:在上一篇文章中(【数据结构-初阶】详解线性表(1)---顺序表),我们详细介绍了线性表系列第一种数据结构---顺序表,这个数据结构是以数组为底建立的,也学习了如何用线性表进行增删查改的操作,那么我们今天就用顺序表进行解题~~~   题目一:移除元素 这是题目链接:27.移除元素,下面是具体的题目与示例: 由题意知,这道题是想让我们将数组中值为val的元素删除,我们能怎么做呢? 创建新的数组?那不行,题目已经要求我们只能在原地进行操作了,就意味着不能创建新的数组来进行辅助 那该怎么办呢?简单,我们只需用上算法中最基础的---双指针算法了 我们用双指针,不一定用真的指针指向某个元素,有时也可以用下标,讲究的是一种算法思想,并没有一定的形式 我们用两个指针,刚开始都同事之下那个num数组的第一个元素,随后将其中一个指针用于遍历数组,如果两个指针指向的内容不相同,那就将内容进行交换,两个指针同时向后移动一位;如果相同

By Ne0inhk