以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:
问题描述
笑笑想要购买贺年卡,他需要购买 m
张贺年卡,并从 n
个商店中选择。每个商店有其贺年卡的单价和存货量。笑笑的目标是找到购买这些贺年卡的最少花费。
输入格式
- 第一行包含两个整数
m
和 n
,分别表示要购买的贺年卡数量和商店的数量。 - 接下来的
n
行,每行包含两个整数,分别表示该商店的贺年卡单价和存货量。
输出格式
算法思路
- 读取输入:读取
m
和 n
,然后读取每个商店的单价和存货量。 - 存储商店信息:使用一个结构体数组或二维数组存储每个商店的单价和存货量。
- 排序:根据单价对商店进行排序,确保先考虑价格最低的商店。
- 计算最少花费:从价格最低的商店开始,尽可能多地购买贺年卡,直到达到所需的数量
m
。 - 输出结果:输出总花费。
示例代码
#include <iostream>
#include <vector>
#include <algorithm> // 用于排序
using namespace std;
// 定义商店的结构体
struct Shop {
int price; // 单价
int stock; // 存货量
};
int main() {
int m, n;
cin >> m >> n; // 读取贺年卡数量和商店数量
vector<Shop> shops(n); // 创建商店数组
// 读取每个商店的信息
for (int i = 0; i < n; ++i) {
cin >> shops[i].price >> shops[i].stock;
}
// 根据单价对商店进行排序
sort(shops.begin(), shops.end(), [](const Shop& a, const Shop& b) {
return a.price < b.price;
});
int totalCost = 0; // 初始化总花费
int cardsLeft = m; // 剩余需要购买的贺年卡数量
// 遍历商店,计算总花费
for (const auto& shop : shops) {
if (cardsLeft <= shop.stock) {
totalCost += shop.price * cardsLeft; // 购买剩余的贺年卡
break; // 已经购买完毕,退出循环
} else {
totalCost += shop.price * shop.stock; // 购买当前商店的所有存货
cardsLeft -= shop.stock; // 更新剩余需要购买的贺年卡数量
}
}
cout << totalCost << endl; // 输出总花费
return 0;
}
示例输入和输出
示例输入:
10 4
4 3
6 2
8 10
3 6
示例输出:
36
解释
- 笑笑首先在价格为3的商店购买了6张贺年卡,花费了
3 * 6 = 18
。 - 然后他在价格为4的商店购买了剩下的4张,花费了
4 * 4 = 16
。 - 总花费为
18 + 16 = 36
。
注意事项
- 确保输入数据的格式正确。
- 在实际应用中,可能需要添加额外的错误检查和输入验证。