7-05. 魔法優惠券(25)
在火星上有個魔法商店,提供魔法優惠券。每個優惠劵上印有一個整數面值K,表示若你在購買某商品時使用這張優惠劵,可以得到K倍該商品價值的回報!該商店還免費贈送一些有價值的商品,但是如果你在領取免費贈品的時候使用面值爲正的優惠劵,則必須倒貼給商店K倍該商品價值的金額…… 但是不要緊,還有面值爲負的優惠劵可以用!(真是神奇的火星)
例如,給定一組優惠劵,面值分別爲1、2、4、-1;對應一組商品,價值爲火星幣M$7、6、-2、-3,其中負的價值表示該商品是免費贈品。我們可以將優惠劵3用在商品1上,得到M$28的回報;優惠劵2用在商品2上,得到M$12的回報;優惠劵4用在商品4上,得到M$3的回報。但是如果一不小心把優惠劵3用在商品4上,你必須倒貼給商店 M$12。同樣,當你一不小心把優惠劵4用在商品1上,你必須倒貼給商店 M$7。
規定每張優惠券和每件商品都只能最多被使用一次,求你可以得到的最大回報。
輸入格式說明:
輸入有2行。第1行首先給出優惠劵的個數N,隨後給出N個優惠劵的整數面值。第2行首先給出商品的個數M,隨後給出M個商品的整數價值。N和M在[1, 106]之間,所有的數據大小不超過230,數字間以空格分隔。
輸出格式說明:
輸出可以得到的最大回報。
樣例輸入與輸出:
序號 | 輸入 | 輸出 |
1 |
4 1 2 4 -1 4 7 6 -2 -3 |
43 |
2 |
4 3 2 6 1 3 2 6 3 |
49 |
3 |
5 0 0 0 0 -1 4 0 0 0 1 |
0 |
4 |
7 3 36 -1 73 2 3 6 6 -1 -1 -1 -1 -1 -1 |
1 |
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int a1[1000005],a2[1000005],b1[1000005],b2[1000005];
bool cmp1(int a,int b)
{
return a>b;
}
bool cmp2(int a,int b)
{
return a<b;
}
int main()
{
int n,m,i,j,p,x1,y1,x2,y2,sum;
scanf("%d",&n);
x1=y1=0;
for(i=0;i<n;i++)
{
scanf("%d",&p);
if(p>0)
a1[x1++]=p;
else if(p<0)
a2[y1++]=p;
}
scanf("%d",&m);
x2=y2=0;
for(i=0;i<m;i++)
{
scanf("%d",&p);
if(p>0)
b1[x2++]=p;
else if(p<0)
b2[y2++]=p;
}
sort(a1,a1+x1,cmp1);
sort(a2,a2+y1,cmp2);
sort(b1,b1+x2,cmp1);
sort(b2,b2+y2,cmp2);
i=0;
sum=0;
while(i<x1&&i<x2)
{
sum+=a1[i]*b1[i];
i++;
}
i=0;
while(i<y1&&i<y2)
{
sum+=a2[i]*b2[i];
i++;
}
printf("%d\n",sum);
return 0;
}