pat甲级 1037 Magic Coupon (25 分) (贪心)

题目链接:传送门

思路:把两个给出的组存入数组,从小到大排序,然后先从0下标开始计算负数,两两配对,然后算正数,同理。 有一个需要注意的点我本来是只是从0-n-1扫描一遍,把正数加入答案的,扣了几分,因为配对顺序可能会错,本来应该最大的正数相乘,而这样做结果可能会变小。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll; 

vector <ll> va , vb;

int main() {
	int nc , np , t;
	ios::sync_with_stdio(0);
	cin >> nc;
	for(int i = 0 ; i < nc ; i++) {
		cin >> t;
		va.push_back(t);
	}
	cin >> np;
	for(int i = 0 ; i< np ; i++) {
		cin >> t;
		vb.push_back(t);
	}
	sort(va.begin() , va.end());
	sort(vb.begin() , vb.end());
	ll ans = 0;
	for(int i = 0 , j = 0 ; i < va.size() && j < vb.size() ; i++ , j++) {
		if(va[i] < 0 && vb[j] < 0)ans += va[i] * vb[j];
		else break;
	}
	for(int i = va.size() - 1 , j = vb.size() - 1 ; i >= 0 && j >= 0 ; i-- , j--) {
		if(va[i] > 0 && vb[j] > 0)ans += va[i] * vb[j];
		else break;
	}
	cout << ans << "\n";
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/103033708
今日推荐