PAT 1037. Magic Coupon (25)

1037. Magic Coupon (25)

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.

Input Specification:

Each input file contains one test case. For each case, the first line contains the number of coupons NC, followed by a line with NC coupon integers. Then the next line contains the number of products NP, followed by a line with NP product values. Here 1<= NC, NP <= 105, and it is guaranteed that all the numbers will not exceed 230.

Output Specification:

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

Sample Input:

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

Sample Output:

43

应用排序不等式。将数字分为整数和负数,将最大(正数)的优惠券匹配价值最大(正数)的产品,最小(负数)匹配最小(负数)价值的产品。
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <algorithm>
 5
 6 using namespace std;
 7
 8 bool cmp(int integer1, int integer2)
 9 {
10     return integer1 > integer2;
11 }
12
13 int main()
14 {
15     int NC, NP;
16     vector<int> positiveCoupons, negativeCoupons,  positiveProduct, negativeProduct;
17     cin >> NC;
18     for (int i = 0; i < NC; i++)
19     {
20         int coupon;
21         scanf("%d", &coupon);
22         if (coupon > 0)
23             positiveCoupons.push_back(coupon);
24         else if (coupon < 0)
25             negativeCoupons.push_back(coupon);
26
27     }
28     sort(positiveCoupons.begin(), positiveCoupons.end(), cmp);
29     sort(negativeCoupons.begin(), negativeCoupons.end());
30     cin >> NP;
31     for (int i = 0; i < NP; i++)
32     {
33         int product;
34         scanf("%d", &product);
35         if (product > 0)
36             positiveProduct.push_back(product);
37         else if (product < 0)
38             negativeProduct.push_back(product);
39
40     }
41     sort(positiveProduct.begin(), positiveProduct.end(), cmp);
42     sort(negativeProduct.begin(), negativeProduct.end());
43
44     int MaxMonmey = 0;
45     for (int i = 0; i < positiveCoupons.size() && i < positiveProduct.size(); i++)
46         MaxMonmey += positiveCoupons[i] * positiveProduct[i];
47     for (int i = 0; i < negativeCoupons.size() && negativeProduct.size(); i++)
48         MaxMonmey += negativeCoupons[i] * negativeProduct[i];
49
50     cout << MaxMonmey;
51 }
时间: 2024-10-15 08:35:30

PAT 1037. Magic Coupon (25)的相关文章

PAT Advanced 1037 Magic Coupon (25) [贪?算法]

题目 The magic shop in Mars is ofering 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 ofers some bonu

PAT甲题题解-1037. Magic Coupon (25)-贪心,水

题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积. 将两个序列的正和负数分开,排个序,然后分别将正1和正2前面的相乘,负1和负2前面的相乘,累加和即可. #include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <cmath> #include <vector> using namespa

PAT (Advanced Level) 1037. Magic Coupon (25)

简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<map> #include<queue> #include<vector> using namespace std; const int maxn=100000+10; int n,m; long long

【PAT甲级】1037 Magic Coupon (25 分)

题意: 输入一个正整数N(<=1e5),接下来输入N个整数.再输入一个正整数M(<=1e5),接下来输入M个整数.每次可以从两组数中各取一个,求最大的两个数的乘积的和. 代码: #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long a[100007],b[100007];long long c[100007],d[100007];int cnta,cntb,cntc,cntd

1037. Magic Coupon (25)

题目例如以下: 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 so

PAT 1037 Magic Coupon

#include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> using namespace std; void print(vector<int> &v) { int len = v.size(); for (int i=0; i<len; i++) { printf(" %d", v[i]); } printf(&quo

1037 Magic Coupon (25 分)

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

1037. 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

A1037 Magic Coupon (25 分)

一.技术总结 这也是一个贪心算法问题,主要在于想清楚,怎么解决输出和最大,两个数组得确保符号相同位相乘,并且绝对值尽可能大. 可以用两个vector容器存储,然后排序从小到大或是从大到小都可以,一次从两端开始相乘,保证符号相同. 二.参考代码 #include<iostream> #include<algorithm> #include<vector> using namespace std; bool cmp(int a, int b){ return a >