PAT-ADVANCED1037——Magic Coupon

我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED

原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805451374313472

题目描述:

题目翻译:

1037 火星优惠券

火星上的神奇商店提供一些魔法优惠券。 每张优惠券上都印有一个整数N,这意味着当您将此优惠券与产品一起使用时,您可能会获得该产品价值的N倍! 更重要的是,该商店还免费提供一些奖金产品。 但是,如果你在这个奖励产品中使用正面N的优惠券,你将需要向商店支付N倍于奖励产品的价值......但是,嘿,奇怪的是,他们有一些负N的优惠券!

例如,给定一组优惠券{1 2 4 -1},以及一组产品值{7 6 -2 -3}(以美元 M $计算),其中负值对应于奖励产品。 你可以将优惠券3(N为4)应用于产品1(价值M $ 7)以获得M $ 28;优惠券2到产品2获得12美元的回报;优惠券4到产品4,以获得M $ 3。另一方面,如果你将优惠券3应用于产品4,则必须向商店支付M $ 12。

每个优惠券和每个产品最多可以选择一次。 你的任务是获得尽可能多的钱。

输入格式:

每个输入文件包含一个测试用例。对每个测试用例,第一行给出优惠券的数目Nc,接下来一行给出Nc个优惠券的数值。第三行给出产品数目Np,加下来一行给出Np个产品的价值。其中1 <= Nc, Np <= 10 ^ 5,题目保证所有的数字均不超过2 ^ 30。

输出格式:

对每个测试用例,输出你能获得的最多的钱。

输入样例:

4
1 2 4 -1
4
7 6 -2 -3

输出样例:

43

知识点:贪心算法

思路:对正数和负数分成两组并对正数由大到小排序对负数由小到大排序

正的优惠券只和正的产品价值相乘,负的优惠券只和负的产品价值相乘。

虽然题给的单个数字不超过2 ^ 30,但涉及乘法和加法就可能越界,需要用long型变量来保存结果。

时间复杂度是O(NlogN),其中N为Nc和Np中的较大值。空间复杂度是O(Nc + Np)。

C++代码:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int Nc, Np;
vector<int> positiveCoupons;
vector<int> negativeCoupons;
vector<int> positiveValues;
vector<int> negativeValues;
long result;

bool cmp(int a, int b);

int main(){
	scanf("%d", &Nc);
	int num;
	for(int i = 0; i < Nc; i++){
		scanf("%d", &num);
		if(num < 0){
			negativeCoupons.push_back(num);
		}else if(num > 0){
			positiveCoupons.push_back(num);
		}
	}
	scanf("%d", &Np);
	for(int i = 0; i < Np; i++){
		scanf("%d", &num);
		if(num < 0){
			negativeValues.push_back(num);
		}else if(num > 0){
			positiveValues.push_back(num);
		}
	}
	sort(positiveCoupons.begin(), positiveCoupons.end(), cmp);
	sort(positiveValues.begin(), positiveValues.end(), cmp);
	for(int i = 0; i < positiveCoupons.size() && i < positiveValues.size(); i++){
		result += positiveCoupons[i] * positiveValues[i];
	}
	sort(negativeCoupons.begin(), negativeCoupons.end());
	sort(negativeValues.begin(), negativeValues.end());
	for(int i = 0; i < negativeCoupons.size() && i < negativeValues.size(); i++){
		result += negativeCoupons[i] * negativeValues[i];
	}
	printf("%ld\n", result);
	return 0;
}

bool cmp(int a, int b){
	return a > b;
}

C++解题报告:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值