CSP-X2024解题报告(T1)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值