PAT-A1037-Magic Coupon

PAT Magic Coupon - 题目链接


题目描述

 The magic shop in Mars is offering some magic coupons. Each coupon has an integer N printed on it, meaning that when you use this coupon with a product, you may get N times the value of that product back! What is more, the shop also offers some bonus product for free. However, if you apply a coupon with a positive N to this bonus product, you will have to pay the shop N times the value of the bonus product… but hey, magically, they have some coupons with negative N’s!
 For example, given a set of coupons { 1 2 4 −1 }, and a set of product values { 7 6 −2 −3 } (in Mars dollars M$) where a negative value corresponds to a bonus product. You can apply coupon 3 (with N being 4) to product 1 (with value M$7) to get M$28 back; coupon 2 to product 2 to get M$12 back; and coupon 4 to product 4 to get M$3 back. On the other hand, if you apply coupon 3 to product 4, you will have to pay M$12 to the shop.
 Each coupon and each product may be selected at most once. Your task is to get as much money back as possible.

输入描述

 Each input file contains one test case. For each case, the first line contains the number of coupons N
C , followed by a line with N C coupon integers. Then the next line contains the number of products N
p​ , followed by a line with N P product values. Here 1≤N C ,N P ≤10 e5, and it is guaranteed that all the numbers will not exceed 2 e30 .

输出描述

 For each test case, simply print in a line the maximum amount of money you can get back.


示例:

输入

4
1 2 4 -1
4
7 6 -2 -3

输出

43


解题思路

 将两个集合读入两个不同的数组之后,对数组从小到大进行排序,正值和正值相乘,负值和负值相乘。在正值相乘时,可以从后面的数组的后面开始;负值相乘时从前面开始,最后结果相加就可以了。

参考代码

#include <cstdio>
#include <algorithm>

using namespace std;
const int maxn = 100010; //根据数据量的要求 开辟空间
int coupons[maxn], product[maxn];

int main() {
    int m, n;
    scanf("%d", &m);
    for (int i = 0; i < m; ++i) {
        scanf("%d", &coupons[i]);
    }
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &product[i]);
    }
    sort(coupons, coupons + m);
    sort(product, product + n);
    int ans = 0, i = 0, j;
    while (i < m && i < n && coupons[i] < 0 && product[i] < 0) { //负值相乘阶段 此时可以公用一个变量 都是从头开始的
        ans += coupons[i] * product[i];
        ++i;
    }
    i = m - 1;
    j = n - 1;
    while (i >= 0 && j >= 0 && coupons[i] > 0 && product[j] > 0) { //数组长度不同就必须逐一控制数组的长度了
        ans += coupons[i] * product[j];
        --i;
        --j;
    }
    printf("%d\n", ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值