郑州网络推广哪个好上海seo博客
7-83 魔法优惠券
分数 25
全屏浏览题目
作者 陈越
单位 浙江大学
在火星上有个魔法商店,提供魔法优惠券。每个优惠劵上印有一个整数面值K,表示若你在购买某商品时使用这张优惠劵,可以得到K倍该商品价值的回报!该商店还免费赠送一些有价值的商品,但是如果你在领取免费赠品的时候使用面值为正的优惠劵,则必须倒贴给商店K倍该商品价值的金额…… 但是不要紧,还有面值为负的优惠劵可以用!(真是神奇的火星)
例如,给定一组优惠劵,面值分别为1、2、4、-1;对应一组商品,价值为火星币M7、6、−2、−3,其中负的价值表示该商品是免费赠品。我们可以将优惠劵3用在商品1上,得到M28的回报;优惠劵2用在商品2上,得到M12的回报;优惠劵4用在商品4上,得到M3的回报。但是如果一不小心把优惠劵3用在商品4上,你必须倒贴给商店M12。同样,当你一不小心把优惠劵4用在商品1上,你必须倒贴给商店M7。
规定每张优惠券和每件商品都只能最多被使用一次,求你可以得到的最大回报。
输入格式:
输入有两行。第一行首先给出优惠劵的个数N,随后给出N个优惠劵的整数面值。第二行首先给出商品的个数M,随后给出M个商品的整数价值。N和M在[1, 106]之间,所有的数据大小不超过230,数字间以空格分隔。
输出格式:
输出可以得到的最大回报。
输入样例:
4 1 2 4 -1
4 7 6 -2 -3
代码分享:
#include <iostream>
#include <algorithm>
using namespace std;
int s1[1000100]={0};//优惠券的负数
int s2[1000100]={0};//优惠券的正数
int w1[1000100]={0};//价钱的负数
int w2[1000100]={0};//价钱的正数
int main(){int n,m,sum=0;int a1=0,a2=0,b1=0,b2=0;cin>>n;for(int i=0;i<n;i++){int z;cin>>z;if(z<0){s1[a1]=z;a1++;}else{s2[a2]=z;a2++;}}//输入每张优惠券的数额cin>>m;for(int i=0;i<m;i++){int z;cin>>z;if(z<0){w1[b1]=z;b1++;}else{w2[b2]=z;b2++;}}//输入每件商品的价格sort(s1,s1+a1);//把优惠券的负数从小到大排序sort(s2,s2+a2,greater<int>());//优惠券的正数从大到小排列sort(w1,w1+b1);//把商品的价格的负数从小到大排序sort(w2,w2+b2,greater<int>());//把商品的价格的正数从大到小排序for(int i=0;i<a1&&i<b1;i++){sum+=s1[i]*w1[i];}//计算负数的值for(int j=0;j<a2&&j<b2;j++){sum+=s2[j]*w2[j];}//计算正数的值cout<<sum;return 0;
}