實驗項目 7-05 魔法優惠券(25)

7-05. 魔法優惠券(25)

時間限制
1000 ms
內存限制
32000 kB
代碼長度限制
8000 B
判題程序
Standard

在火星上有個魔法商店,提供魔法優惠券。每個優惠劵上印有一個整數面值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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章