我的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++解题报告: