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️⃣ 名字再排输出


🎉 总结

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

🌟 解决这个问题需要:

  • 思路拆分能力

  • 排序规则表达能力

  • 模拟真实问题的能力


相关推荐
wangjialelele10 小时前
二刷C语言后,一万字整理细碎知识点
c语言·开发语言·数据结构·c++·算法·cpp
mjhcsp10 小时前
P3145 [USACO16OPEN] Splitting the Field G(题解)
开发语言·c++·算法
空空潍10 小时前
hot100-合并区间(day14)
c++·算法·leetcode
是娇娇公主~10 小时前
算法——【最大子数组和】
数据结构·c++·算法
XH华10 小时前
备战蓝桥杯,第一章:C++入门
c++·蓝桥杯
Sheep Shaun10 小时前
深入理解AVL树:从概念到完整C++实现详解
服务器·开发语言·数据结构·c++·后端·算法
XH华10 小时前
备战蓝桥杯,第二章:C++语言的输入输出(上)
开发语言·c++·蓝桥杯
C++ 老炮儿的技术栈10 小时前
Qt中自定义 QmyBattery 电池组件开发
c语言·开发语言·c++·windows·qt·idea·visual studio
Howrun77710 小时前
Linux_C++_日志实例
linux·运维·c++
梵尔纳多11 小时前
第一个 3D 图像
c++·图形渲染·opengl