CSP-X2024年T1题解

双十一,很多人在疯狂地购物。

商家推出了各种各样的优惠活动,吸引顾客购买更多的商品。

某商家推出如下的优惠活动:

该商家共有 n 件商品,单独购买第 i 件商品的费用为 ai 。顾客也可以花费 w 购买 一张优惠券,一张优惠卷最多可兑换 m 件商品(无需额外付费)。

顾客可以购买任意张优惠卷;

如果最后商品不足 m 件,优惠卷也可以使用。

求顾客购买完所有 n 件商品的最小费用

输入格式

输入文件为 buy.in

第一行有 3 个整数 n, m, w。

第二行有 n 个整数,第 i 个为 ai ,表示第 i 件商品的费用。

输出格式

输出文件为 buy.out

购买所有商品的最小费用。

样例

输入样例 #1

5 2 8
2 7 1 8 4

输出样例 #1

15 

【样例1说明】

样例 1 说明:花费 8 买一张优惠卷,兑换第 2、第 4 件商品;第 1、第 3、第 5 件商品直接购买。

共花费 8 + 2 + 1 + 4 = 15。

输入样例 #2

5 3 8
6 7 4 8 9

输出样例 #2

16 

【样例2说明】

样例 2 说明:花费 16 购买两张优惠卷,能兑换所有商品

花费的钱越少就是买优惠券赚的最大。

这就是一道贪心题:

从大到小排序后 

### CSP-J 2024 复赛 T1 题目解析 题目描述涉及扑克牌问题,目标是从给定的组扑克牌中计算出重复的扑克牌总数。通过分析已知信息[^2],可以得出该题的核心在于统计不重复扑克牌的数量并进步推导出重复扑克牌的数量。 #### 思路分析 此题的关键操作包括以下几个方面: 1. **输入处理**:读取扑克牌数据。 2. **排序**:利用 `sort` 函数对扑克牌数组进行字典序排列。 3. **去重计数**:遍历排序后的数组,统计不重复扑克牌的数量。 4. **结果计算**:总扑克牌数量减去不重复扑克牌数量即可得到重复扑克牌的数量。 以下是基于 C++ 的具体代码实现: ```cpp #include <bits/stdc++.h> using namespace std; string s[55]; int n; int cnt = 0; // 记录有几张扑克牌不重样 int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i]; } sort(s + 1, s + n + 1); // 排序 for (int i = 1; i <= n; i++) { if (i == 1 || s[i] != s[i - 1]) { // 找到不重样的牌 cnt++; } } cout << 52 - cnt; // 输出重复扑克牌数量 return 0; } ``` #### 代码详解 - 使用字符串数组存储每张扑克牌的信息。 - 调用标准库中的 `sort` 方法对扑克牌按字典顺序排序。 - 利用循环判断相邻两张扑克牌是否相同来统计不重复扑克牌的数量。 - 最终输出的结果为固定扑克牌总量(52)减去不重复扑克牌的数量。 这种方法的时间复杂度主要由排序决定,为 \(O(n \log n)\),其中 \(n\) 是输入扑克牌的数量。 --- ### 可选优化方法 如果希望减少手动比较的工作量,也可以考虑使用 STL 中的容器 `set` 或者其他高级算法完成任务。例如,参考 NOIP 普及组经典题目 “明明的随机数”[^3] 提供的解法,可以通过如下方式简化逻辑: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; set<string> pokerSet; for (int i = 0; i < n; ++i) { string card; cin >> card; pokerSet.insert(card); } cout << 52 - pokerSet.size(); return 0; } ``` 在此版本中,`set` 数据结构自动完成了去重功能,从而省去了显式的比较过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值