题目描述
为了庆祝一年一度的圣诞节,社区决定给本社区的儿童准备礼物。礼品公司的仓库中有 N 种不同的礼物,每种礼物的库存数量是无限的,但不同的儿童对不同礼物的喜好各不相同。
根据调查数据,有 Ci 名儿童喜欢第 i 种礼物,这种礼物的采购单价为 Pi 元。
社区为本次圣诞礼物准备了 M 元的采购预算。请你编程计算出,在有限的预算内,最多可以使得多少名儿童领到自己喜欢的礼物。
输入
第一行包含两个正整数 N 和 M,分别表示礼物的种类数和社区采购的预算。
接下来 N 行,每行包含两个正整数 Pi 和 Ci ,分别表示第 i 种礼物的单价和喜欢这种礼物的儿童人数。
输出
输出一个整数,表示社区中最多能够领到礼物的儿童数。
样例
输入
5 20
10 2
8 3
12 1
15 1
4 1
输出
3
输入
6 28
1 1
3 1
6 1
2 1
12 1
15 1
输出
5
输入
16 38
10 2
5 1
2 8
3 4
4 5
5 2
9 1
12 3
15 6
18 7
12 1
8 2
3 4
10 6
3 5
5 1
输出
15
说明
样例 1 说明
社区有 20 元预算,可以采购 2 个第 2 种礼物,花费 2×8=16 元,再采购 1 个第 5 种礼物,花费 4 元,共花费 20 元。可以让最多 3 个儿童领到自己喜欢的礼物。
数据范围
测试点 1 满足 Ci =1,1≤N≤20。
测试点 2∼4 满足 1≤N≤20。
测试点 5∼6 满足 1≤N≤1000。
测试点 7∼10 满足 1≤N≤10^5 ,1≤M≤10^18 ,1≤Pi ,Ci ,Pi ×Ci ≤10^18 。
要解决这个问题,我们需要制定一个策略,以确保在不超过给定预算的情况下,尽可能多地满足儿童对礼物的需求。这里可以采用贪心算法的方式来实现。
解题思路
-
输入数据:我们需要读取礼物的种类数
N
和预算M
,然后读取每种礼物的单价P
和喜欢这种礼物的儿童数量C
。 -
排序:将所有礼物按单价从低到高排序。这样我们可以优先考虑价格较低的礼物,以最大化满足儿童的可能性。
-
贪心选择:遍历排序后的礼物列表,尽可能多地为儿童采购礼物:
- 对于每种礼物,计算在当前预算下,能够购买的最多数量。
- 更新预算,同时记录已满足的儿童数量。
-
终止条件:一旦预算不足以购买任何礼物,或者所有的礼物都已经考虑完,程序结束。
代码
以下是完整的 C++ 代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
long long N, M; // 礼物的种类数和预算
cin >> N >> M;
vector<pair<long long, long long>> gifts(N); // 存储礼物的单价和喜欢数量
for (int i = 0; i < N; ++i) {
long long P, C;
cin >> P >> C;
gifts[i] = {P, C}; // 将单价和喜欢数量存储为一对
}
// 按照单价从低到高排序
sort(gifts.begin(), gifts.end());
long long totalChildren = 0; // 满足的儿童数量
// 购买礼物
for (const auto& gift : gifts) {
long long price = gift.first; // 礼物单价
long long count = gift.second; // 喜欢这种礼物的儿童数量
// 在当前预算内能买的最多数量
long long maxAffordable = M / price;
// 实际满足的数量是最小的
long long actualCount = min(maxAffordable, count);
totalChildren += actualCount; // 更新满足的儿童数量
M -= actualCount * price; // 更新预算
// 如果预算已经用完,提前结束
if (M <= 0) {
break;
}
}
cout << totalChildren << endl; // 输出结果
return 0;
}
代码解释
- 输入和初始化:读取礼物的种类和预算,构建一个存储礼物单价和儿童数量的向量。
- 排序:使用
sort
函数按礼物单价排序。 - 贪心选择:
- 对于每种礼物,计算在当前预算下能购买的最大数量和喜欢这种礼物的儿童人数,选择最小值作为实际满足的。
- 更新总满足的儿童数量和剩余预算。
- 输出结果:最后输出能够满足的儿童数量。
复杂度分析
- 时间复杂度:主要是排序阶段,其复杂度为 O(N log N),在贪心选择阶段是 O(N)。整体复杂度为 O(N log N)。
- 空间复杂度:由于使用了一个额外的向量来存储礼物数据,空间复杂度为 O(N)。
这种方法适用于给定范围内的所有输入数据,能够有效解决问题。