A. [CSP-X 2024 -- T1] 购物
内存限制:256 MiB
时间限制:1000 ms
输入文件:buy.in
输出文件:buy.out
题目类型:传统
评测方式:文本比较
题目描述
双十一,很多人在疯狂地购物。
商家推出了各种各样的优惠活动,吸引顾客购买更多的商品。
某商家推出如下的优惠活动:
该商家共有 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 购买两张优惠卷,能兑换所有商品
数据范围与提示
【数据范围】
30% 的数据:1≤n≤10^3,1≤m≤10^3,1≤w≤10^9,1≤ai≤10^9;
100% 的数据:1≤n≤2×10^5,1≤m≤2×10^5,1≤w≤10^9,1≤ai≤10^9。将a数组排序,每m件看一下能不能用优惠券,能的用,不能就原价买,剩下不足m件的也是。
#include<bits/stdc++.h> using namespace std; long long cnt=0,k=0,ans=0; int main(){ freopen("buy.in","r",stdin); //freopen("buy.out","w",stdout); long long n,m,w,a[200005]; cin>>n>>m>>w; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1); for(int i=n;i>=1;i--){ cnt+=a[i]; k++; if(k==m){ if(cnt>w)ans+=w; else ans+=cnt; cnt=k=0; } } if(cnt>w)ans+=w; else ans+=cnt; cout<<ans; return 0; }
CSP-X2024解题报告(T1)
于 2024-11-20 20:31:47 首次发布