前言
正文
参考题解
#include<iostream>
#include<algorithm>
using namespace std;
/* 贪心问题 给出指定个数的优惠券以及产品的价值,每张优惠券上面的数字表示返回的次数, 如果每张优惠券上的数字符号与产品的价值的符号相同,则返回顾客二者的乘积作为回报; 若异号,则顾客需要支付二者的乘积给商店。现在需要求出顾客能够获得的回报的最大值是多少 */
const int N=1e5+10;
int c[N],p[N];
int n,m,res=0;
bool cmp(int a,int b){
return a>b;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&c[i]);
scanf("%d",&m);
for(int i=0;i<m;i++)scanf("%d",&p[i]);
sort(c,c+n,cmp);
sort(p,p+m,cmp);
for(int i=0,j=0;i<n&&j<m;i++,j++){
if(c[i]>=0&&p[j]>=0)res+=c[i]*p[j];
else break;
}
for(int i=n-1,j=m-1;i>=0&&j>=0;i--,j--){
if(c[i]<=0&&p[j]<=0)res+=c[i]*p[j];
else break;
}
printf("%d\n",res);
return 0;
}