25年1月-A组(萌新)- 圣诞礼物

题目描述

为了庆祝一年一度的圣诞节,社区决定给本社区的儿童准备礼物。礼品公司的仓库中有 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  。

要解决这个问题,我们需要制定一个策略,以确保在不超过给定预算的情况下,尽可能多地满足儿童对礼物的需求。这里可以采用贪心算法的方式来实现。

解题思路

  1. 输入数据:我们需要读取礼物的种类数 N 和预算 M,然后读取每种礼物的单价 P 和喜欢这种礼物的儿童数量 C

  2. 排序:将所有礼物按单价从低到高排序。这样我们可以优先考虑价格较低的礼物,以最大化满足儿童的可能性。

  3. 贪心选择:遍历排序后的礼物列表,尽可能多地为儿童采购礼物:

    • 对于每种礼物,计算在当前预算下,能够购买的最多数量。
    • 更新预算,同时记录已满足的儿童数量。
  4. 终止条件:一旦预算不足以购买任何礼物,或者所有的礼物都已经考虑完,程序结束。

代码

以下是完整的 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;
}

代码解释

  1. 输入和初始化:读取礼物的种类和预算,构建一个存储礼物单价和儿童数量的向量。
  2. 排序:使用 sort 函数按礼物单价排序。
  3. 贪心选择
    • 对于每种礼物,计算在当前预算下能购买的最大数量和喜欢这种礼物的儿童人数,选择最小值作为实际满足的。
    • 更新总满足的儿童数量和剩余预算。
  4. 输出结果:最后输出能够满足的儿童数量。

复杂度分析

  • 时间复杂度:主要是排序阶段,其复杂度为 O(N log N),在贪心选择阶段是 O(N)。整体复杂度为 O(N log N)。
  • 空间复杂度:由于使用了一个额外的向量来存储礼物数据,空间复杂度为 O(N)。

这种方法适用于给定范围内的所有输入数据,能够有效解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值