题目大意:给出两个序列,每个序列中有正数有负数,每次从两个序列中各选一个数相乘,求出可以得到的最大的乘积和。每个序列中的数只能被选一次。
贪心算法,首先对两个序列,分别区分开的正数和负数,并对这四个序列进行排序,每次取两个负数序列中最小的相乘,负数取完后再取两个正数序列中最大的相乘。结果累加。
AC代码:
#include <vector>
#include <algorithm>
#include <cstdio>
#include <set>
using namespace std;
typedef long long ll;
int main()
{
int NC, NP;
scanf("%d", &NC);
vector<ll> cPositive, cNegative, pPositive, pNegative;
for (int i = 0; i < NC; ++i)
{
ll c;
scanf("%lld", &c);
if(c > 0) cPositive.push_back(c);
else if (c < 0) cNegative.push_back(c);
}
scanf("%d", &NP);
for (int i = 0; i < NP; ++i)
{
ll p;
scanf("%lld", &p);
if(p > 0) pPositive.push_back(p);
else if(p < 0) pNegative.push_back(p);
}
sort(cNegative.begin(), cNegative.end());
sort(cPositive.begin(), cPositive.end(), greater<ll>());
sort(pNegative.begin(), pNegative.end());
sort(pPositive.begin(), pPositive.end(), greater<ll>());
unsigned long long sum = 0;
for (int i = 0; i < cNegative.size() && i < pNegative.size(); ++i)
sum += cNegative[i] * pNegative[i];
for (int i = 0; i < cPositive.size() && i < pPositive.size(); ++i)
sum += cPositive[i] * pPositive[i];
printf("%llu", sum);
return 0;
}