PAT A1037マジッククーポン(25分)

トピックリンクhttps://pintia.cn/problem-sets/994805342720868352/problems/994805451374313472

题目描述
火星でのマジックショップでは、いくつかの魔法のクーポンを提供しています。各クーポンは、整数Nは、製品でこのクーポンを使用する場合、あなたがその製品背面のNの倍の値を取得することを意味し、それに印刷されています!詳細は何ですか、ショップも無料で、いくつかのボーナスの製品を提供しています。あなたはこのボーナス製品に正Nでクーポンを適用する場合は、あなたは店Nボーナス製品の倍の値を支払う必要があります...ちょっと、魔法のように、彼らは、負のNさんといくつかのクーポンを持っています!

例えば、クーポン{1 2 4 -1}の組、及び、製品値{7 6 -2 -3}の集合(火星でM $をドル)ここで、負の値が対応するボーナス製品に与えられます。あなたはM $ 28を取り戻すために(値M $ 7との)製品1(Nは4である)クーポン3を適用することができます。M $バック12を取得するための製品2にクーポン2。製品4にクーポン券は4 M $ 3バックを取得します。あなたが製品4にクーポン3を適用した場合一方、あなたは店にMに$ 12支払う必要があります。

各クーポンおよび各製品は、最も一度に選択することができます。あなたの仕事は、できるだけ多くのお金の背部として取得することです。

输入
各入力ファイルは、1つのテストケースが含まれています。各場合について、最初の行は、N Cクーポン整数の行に続くクーポンN Cの数を含んでいます。その後、次の行は、N Pの積値を有する行が続く製品P Nの数を含んでいます。ここ1≤NC、N P≤10^ 5、全ての数は、30 ^ 2を超えないことが保証されます。

输出
各テストケースの場合は、単に行にあなたが戻って得ることができるお金の最大量を印刷します。

サンプル入力
。4
。1 -1 2 4
。4
。7. 6 -2 -3

サンプル出力
43

コード

#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 100010;
int coupon[maxn], product[maxn];
int main(){
	int n, m;
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		scanf("%d", &coupon[i]);
	}
	scanf("%d", &m);
	for(int i = 0; i < m; i++) {
		scanf("%d", &product[i]);
	}
	sort(coupon, coupon + n);
	sort(product, product + m);
	int i = 0, j, ans = 0;
	while(i < n && i < m && coupon[i] < 0 && product[i] < 0) {
		ans += coupon[i] * product[i];
		i++;
	}
	i = n - 1;
	j = m - 1;
	while(i >= 0 && j >= 0 && coupon[i] > 0 && product[j] > 0) {
		ans += coupon[i] * product[j];
		i--;
		j--;
	}
	printf("%d\n", ans);
	return 0;
}
公開された288元の記事 ウォン称賛12 ビュー20000 +

おすすめ

転載: blog.csdn.net/Rhao999/article/details/104742175