本题是一道贪心,正数和负数分别计算就可以了,注释已经写好了
#include<iostream>
#include<vector>
#include<algorithm>//排序用的头文件
using namespace std;
int main()
{
int n, m;
cin >> n;
vector<long long> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
cin >> m;
vector<long long> b(m);
for (int i = 0; i < m; i++)
{
cin >> b[i];
}
vector<long long> a_p, a_g;
vector<long long> b_p, b_g;
for (int i = 0; i < n; i++)//a数组
{
if (a[i] > 0)//如果是正数,就放进a_g
{
a_p.push_back(a[i]);
}
else if (a[i] < 0)//如果是负数,就放进a_g
{
a_g.push_back(a[i]);
}
}
for (int i = 0; i < m; i++)//b数组
{
if (b[i] > 0)//如果是正数,就放进b_g
{
b_p.push_back(b[i]);
}
else if (b[i] < 0)//如果是负数,就放进b_g
{
b_g.push_back(b[i]);
}
}
//正数排序
sort(a_p.begin(), a_p.end(), greater<long long>());
sort(b_p.begin(), b_p.end(), greater<long long>());
//负数排序
sort(a_g.begin(), a_g.end());
sort(b_g.begin(), b_g.end());
long long ans = 0;
int len_pos = min(a_p.size(), b_p.size());
//正数与正数相乘
for (int i = 0; i < len_pos; i++)
{
ans += a_p[i] * b_p[i];
}
int len_neg = min(a_g.size(), b_g.size());
//负数与负数相乘
for (int i = 0; i < len_neg; i++)
{
ans += a_g[i] * b_g[i];
}
cout << ans << endl;
return 0;
}