题目

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 $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\le N_C, N_P \le 10^5$ , and it is guaranteed that all the numbers will not exceed $2^{30}$ .

Output Specification:

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

Sample Input:

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

Sample Output:

1
43

思路

这个是最简单的题目之一了。购物券和商品对应,只有正正和负负可以拿到钱。把两个列表排序,从绝对值大到小的顺序相配对,相乘类和就行了。

代码

Github最新代码,欢迎交流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) { return *(int*)b - *(int*)a; }

int main()
{
	int NC, NP;
	long sum = 0, coupon[100000] = {0}, product[100000] = {0};

	/* read and sort */
	scanf("%d", &NC);
	for (int i = 0; i < NC; i++)
		scanf("%ld", coupon + i);
	qsort(coupon, NC, sizeof(long), cmp);
	scanf("%d", &NP);
	for (int i = 0; i < NP; i++)
		scanf("%ld", product + i);
	qsort(product, NP, sizeof(long), cmp);

	for (int i = 0; coupon[i] > 0 && product[i] > 0; i++)
		sum += coupon[i] * product[i];
	for (int i = 0; coupon[NC - i - 1] < 0 && product[NP - i - 1] < 0; i++)
		sum += coupon[NC - i - 1] * product[NP - i - 1];

	printf("%ld\n", sum);

	return 0;
}