GESP2025年12月认证C++四级真题与解析(编程题2 (优先购买))

一、先看原题:


二、题目解析:

1、📖 故事背景(先把题目"变简单")

小 A 有一些钱 💰,

他走进了一家商店 🏬,

商店里有 很多商品,每个商品都有:

  • 🏷️ 名字(name)

  • 💵 价格(price)

  • 优先级(priority)

⚠️ 注意:优先级数字越小,级别越高!


🧠 小 A 的"买东西三大规则"

小 A 买东西非常讲规矩

🥇 规则 1:

👉 永远先买 优先级最高(数字最小)的商品

🥈 规则 2:

👉 如果优先级一样,买 价格最便宜

🥉 规则 3:

👉 如果优先级、价格都一样,买 名字字典序最小


🎯 题目要我们做什么?

👉 按上面三条规则,

👉 用小 A 的预算,把能买的商品都买下来

👉 最后,把买到的商品名,按字典序输出


2、🧠 整体解题思路(先有"大脑地图")

这道题的本质是一句话:

🧩 "先按规则排序 → 再从前往后买 → 最后把名字排一下输出"

所以可以分成 3 大步

1️⃣ 把商品按"购买规则"排序

2️⃣ 按顺序,一个一个买(看钱够不够)

3️⃣ 把买到的商品名字排序后输出


3、🧱 一步一步拆解


✅ 第一步:用结构体表示一个商品 📦

cpp 复制代码
struct Item {
    string name;   // 商品名
    int price;     // 价格
    int priority;  // 优先级(越小越好)
};

🧒 可以这样理解:

一个 Item

就是一张 商品信息卡片


✅ 第二步:讲清楚 "怎么买才算更好" 🏆

我们要写一个 比较规则函数

cpp 复制代码
bool cmp(const Item &a, const Item &b) {
    if (a.priority != b.priority)
        return a.priority < b.priority;   // 优先级小的先
    if (a.price != b.price)
        return a.price < b.price;         // 价格低的先
    return a.name < b.name;               // 名字小的先
}

🧒 这段话的意思是:

比较两个商品 a 和 b:

① 谁更重要?

② 谁更便宜?

③ 谁名字更靠前?


🧠 知识点小总结

📌 sort + cmp 是四级重点

✔ 规则清楚

✔ 写起来反而不难


✅ 第三步:把所有商品按规则排好队 🚶‍♂️🚶‍♀️

cpp 复制代码
sort(items, items + N, cmp);

🧒 想象:

商品们排成一条长队

👉 最值得买的排在最前面


✅ 第四步:开始买买买 💸

cpp 复制代码
int budget = M;
int count = 0;

for (int i = 0; i < N; i++) {
    if (items[i].price <= budget) {
        budget -= items[i].price;
        bought[count++] = items[i].name;
    }
}

🧒 每一步发生什么?

  • 看第 i 个商品

  • 钱够不够?

    • ✔ 够 → 买!

    • ❌ 不够 → 跳过


✅ 第五步:按字典序输出商品名 📄

⚠️ 题目特别要求:

输出时,商品名要按字典序从小到大

所以我们再排一次:

cpp 复制代码
sort(bought, bought + count);

🧠 四、完整参考程序

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

struct Item {
    string name;
    int price;
    int priority;
};

bool cmp(const Item &a, const Item &b) {
    if (a.priority != b.priority)
        return a.priority < b.priority;
    if (a.price != b.price)
        return a.price < b.price;
    return a.name < b.name;
}

int main() {
    int M, N;
    cin >> M >> N;

    Item items[1005];
    for (int i = 0; i < N; i++) {
        cin >> items[i].name >> items[i].price >> items[i].priority;
    }

    // 按购买规则排序
    sort(items, items + N, cmp);

    string bought[1005];
    int count = 0;
    int budget = M;

    // 按顺序购买
    for (int i = 0; i < N; i++) {
        if (items[i].price <= budget) {
            budget -= items[i].price;
            bought[count++] = items[i].name;
        }
    }

    // 输出前按字典序排序
    sort(bought, bought + count);

    for (int i = 0; i < count; i++) {
        cout << bought[i] << endl;
    }

    return 0;
}

🧠 五、这道题在考什么?

🎯 核心能力清单

  • ✅ 创建结构体

  • ✅ 多条件排序(非常重要!)

  • sort + cmp 的使用

  • ✅ 模拟现实规则

  • ✅ 字符串字典序


🎒 六、这道题的"买东西口诀"

🧠 优先购买四步法

1️⃣ 商品排队

2️⃣ 从优先的买起

3️⃣ 钱不够就跳

4️⃣ 名字再排输出


🎉 总结

🌟 这是一道 规则多,但逻辑非常清楚 的好题

🌟 解决这个问题需要:

  • 思路拆分能力

  • 排序规则表达能力

  • 模拟真实问题的能力


相关推荐
青岛少儿编程-王老师2 小时前
CCF编程能力等级认证GESP—C++7级—20251227
开发语言·c++
我可以将你更新哟2 小时前
在Ubuntu 22.04上安装C++编译工具
linux·c++·ubuntu
Skrrapper2 小时前
TCPTP协议是什么?以及Socket使用指南
网络·c++·websocket·计算机网络
咔咔咔的2 小时前
840. 矩阵中的幻方
c++
星火开发设计2 小时前
栈的深度解析与C++实现
开发语言·数据结构·c++·学习·知识
再睡一夏就好2 小时前
LInux线程池实战:单例模式设计与多线程安全解析
linux·运维·服务器·开发语言·javascript·c++·ecmascript
我家大宝最可爱2 小时前
windows搭建agent环境
c++·chatgpt
QQ_4376643142 小时前
C++ 可变参数模板、折叠表达式、泛型 Lambda 与引用折叠
开发语言·c++
柏木乃一2 小时前
进程(8)虚拟地址空间/虚拟内存概述.part1
linux·服务器·c++·进程·虚拟内存·fork