Oracle数据库设计开发规范:从建表到PL/SQL的避坑指南
2026/10/9 13:54:33
小 A 有一些钱 💰,
他走进了一家商店 🏬,
商店里有很多商品,每个商品都有:
🏷️名字(name)
💵价格(price)
⭐优先级(priority)
⚠️注意:优先级数字越小,级别越高!
小 A 买东西非常讲规矩:
🥇规则 1:
👉 永远先买优先级最高(数字最小)的商品
🥈规则 2:
👉 如果优先级一样,买价格最便宜的
🥉规则 3:
👉 如果优先级、价格都一样,买名字字典序最小的
👉 按上面三条规则,
👉 用小 A 的预算,把能买的商品都买下来
👉最后,把买到的商品名,按字典序输出
这道题的本质是一句话:
🧩“先按规则排序 → 再从前往后买 → 最后把名字排一下输出”
所以可以分成3 大步:
1️⃣ 把商品按“购买规则”排序
2️⃣ 按顺序,一个一个买(看钱够不够)
3️⃣ 把买到的商品名字排序后输出
struct Item { string name; // 商品名 int price; // 价格 int priority; // 优先级(越小越好) };🧒 可以这样理解:
一个
Item,
就是一张商品信息卡片
我们要写一个比较规则函数:
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是四级重点✔ 规则清楚
✔ 写起来反而不难
sort(items, items + N, cmp);🧒 想象:
商品们排成一条长队
👉最值得买的排在最前面
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 个商品
钱够不够?
✔ 够 → 买!
❌ 不够 → 跳过
⚠️ 题目特别要求:
输出时,商品名要按字典序从小到大
所以我们再排一次:
sort(bought, bought + count);#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️⃣ 名字再排输出
🌟 这是一道规则多,但逻辑非常清楚的好题
🌟 解决这个问题需要:
思路拆分能力
排序规则表达能力
模拟真实问题的能力